Tải bản đầy đủ (.pdf) (114 trang)

MÔ PHỎNG THỐNG KÊ VÀ ỨNG DỤNG

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (600.32 KB, 114 trang )

ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN

NGUYỄN THỊ KIM LOAN

MÔ PHỎNG THỐNG KÊ VÀ ỨNG DỤNG
Chuyên ngành: Lý thuyết Xác suất và Thống kê Toán học
Mã số: 60.46.15

LUẬN VĂN THẠC SĨ: TOÁN HỌC

NGƯỜI HƯỚNG DẪN KHOA HỌC
PGS. TS. NGUYỄN BÁC VĂN

Thành phố Hố Chí Minh – 2011


Lời cảm ơn
Tôi xin gửi lời cảm ơn chân thành và sâu sắc nhất đến PGS. TS Nguyễn
Bác Văn, người Thầy đã tận tình dạy dỗ, hướng dẫn tôi trong suốt quá
trình thực hiện luận văn cao học và tạo mọi điều kiện để tôi có thể
hoàn thành luận văn này.
Tôi xin gửi lời cảm ơn đến các thầy cô khoa Toán − Tin học đã tạo
điều kiện cho tôi hoàn thành khóa học.
Tôi xin cảm ơn gia đình, bạn bè đã động viên và tạo mọi điều kiện
tốt nhất để tôi tiếp tục theo đuổi việc học tập nghiên cứu.

Học viên Nguyễn Thò Kim Loan


Mục lục


Lời mở đầu
1

2

3

SỐ NGẪU NHIÊN

4

1.1

Tạo số giả ngẫu nhiên . . . . . . . . . . . . . . . . . . . . . .

4

1.2

Sử dụng số ngẫu nhiên để tính tích phân . . . . . . . . . .

6

1.3

Bảng số ngẫu nhiên . . . . . . . . . . . . . . . . . . . . . . .

14

TẠO BIẾN NGẪU NHIÊN RỜI RẠC


16

2.1

Phương pháp biến đổi ngược . . . . . . . . . . . . . . . . . .

16

2.2

Tạo hoán vò ngẫu nhiên và ứng dụng trong y khoa. . . .

18

2.3

Tạo biến ngẫu nhiên có phân phối Poisson . . . . . . . . .

30

2.4

Tạo biến ngẫu nhiên có phân phối nhò thức . . . . . . . .

33

2.5

Phương pháp chấp nhận − bác bỏ . . . . . . . . . . . . . .


36

2.6

Phương pháp hỗn hợp . . . . . . . . . . . . . . . . . . . . . .

38

2.7

Tạo vectơ ngẫu nhiên . . . . . . . . . . . . . . . . . . . . . .

40

3 TẠO BIẾN NGẪU NHIÊN LIÊN TỤC

43

3.1

Phương pháp biến đổi ngược . . . . . . . . . . . . . . . . . .

43

3.2

Phương pháp bác bỏ . . . . . . . . . . . . . . . . . . . . . . .

47


1


3.3

Tạo vectơ ngẫu nhiên có phân phối chuẩn hai chiều.
Ứng dụng tạo số liệu giả về (tầm cao, vòng ngực) của
thiếu niên. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

54

4 DÙNG MÔ PHỎNG ĐỂ SO SÁNH HIỆU QUẢ CỦA CÁC PHƯƠNG
PHÁP BOOTSTRAP KHÁC NHAU

61

5 GIỚI THIỆU VỀ PHẦN MỀM R

87

5.1

Các phép tính cơ bản trong R . . . . . . . . . . . . . . . . .

88

5.2

Mô phỏng trong R . . . . . . . . . . . . . . . . . . . . . . . .


88

5.2.1

Tạo một dãy số trong R . . . . . . . . . . . . . . . .

88

5.2.2

Các hàm phân phối xác suất . . . . . . . . . . . . .

90

5.3

Vẽ đồ thò . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

92

5.4

Lập trình trong R . . . . . . . . . . . . . . . . . . . . . . . . .

96

Kết luận

98


Tài liệu tham khảo

99

Phụ lục

100

2


Lời mở đầu
Mô phỏng là cách để mô hình hóa các hiện tượng ngẫu nhiên, nhờ
vậy mà kết quả mô phỏng thường rất chặt chẽ và phù hợp với kết quả
thực tế. Bằng cách quan sát các kết quả mô phỏng các nhà nghiên cứu
có thể có cái nhìn tiên đoán về thế giới thực. Bên cạnh đó, trong một
số nghiên cứu, người thực hiện có thể gặp phải những khó khăn (thiếu
số liệu, tốn thời gian, kinh phí . . . để thực hiện những thí nghiệm). Khi
đó, có thể nhờ mô phỏng để xấp xỉ thực tế, như vậy đòi hỏi ít thời
gian, công sức và tiền bạc . . . so với những phương pháp tiếp cận khác.
Chính vì những lý do trên, trong luận văn này tôi hệ thống lại những
phương pháp mô phỏng trong thống kê, sau đó đi sâu vào thực hiện
một số mô phỏng thực tế để ứng dụng. Luận văn gồm 5 chương
+ Chương 1 tìm hiểu về cách tạo số ngẫu nhiên.
+ Chương 2 và 3 trình bày các phương pháp tạo số liệu giả về biến
ngẫu nhiên rời rạc và liên tục.
+ Chương 4 dùng mô phỏng để so sánh hiệu quả của ba phương pháp
bootstrap khác nhau.
+ Chương 5 giới thiệu về phần mềm R.


3


Chương 1
SỐ NGẪU NHIÊN

Giới thiệu
Số ngẫu nhiên là giá trò của một biến số ngẫu nhiên phân phối đều
trên khoảng (0, 1). Số ngẫu nhiên có nguồn gốc được tạo bởi những
kỹ thuật như tung đồng xu, tung xúc xắc, trộn các lá bài . . . Ngày nay,
phương pháp hiện đại là sử dụng máy tính để tạo số ngẫu nhiên, và số
ngẫu nhiên được tạo từ máy tính gọi là số giả ngẫu nhiên. Số giả ngẫu
nhiên tạo thành một dãy những giá trò, chúng được tạo ra một cách
xác đònh, có tất cả dáng điệu của những biến ngẫu nhiên độc lập phân
phối đều trên khoảng (0, 1).

1.1 Tạo số giả ngẫu nhiên
Phương pháp phổ biến nhất để tạo số ngẫu nhiên gọi là phương pháp
đồng dư nhân.
Thực hiện
Với một giá trò ban đầu x0 , gọi là hạt giống, sau đó thực hiện phép toán
đệ quy lần lượt những giá trò liên tiếp xn , n ≥ 1, bằng cách đặt
xn = axn−1

mod m
4

(1.1)



1.1. TẠO SỐ GIẢ NGẪU NHIÊN

với a và m là những số nguyên dương cho trước, xn là số dư của phép
chia axn−1 cho m. Mỗi xn nhận giá trò trong 0, 1, . . . , m − 1 và xn /m
gọi là số giả ngẫu nhiên, xn /m được dùng để xấp xỉ giá trò của một biến
số ngẫu nhiên phân phối đều trong khoảng (0, 1).
Vì mỗi xn nhận giá trò trong 0, 1, . . . , m − 1, vậy sau hữu hạn giá trò
được tạo thì sẽ có giá trò lặp lại, và lúc đó toàn bộ dãy sẽ bắt đầu lặp
lại. Do đó, chúng ta muốn chọn a và m, với x0 bất kỳ, sao cho số lượng
biến ngẫu nhiên được tạo lớn nhất trước khi quá trình lặp lại xảy ra.
Để làm được điều đó, hằng số a và m nên chọn thỏa 3 tiêu chuẩn
sau
1. Với x0 bất kỳ, dãy kết quả có dáng vẻ của những biến ngẫu nhiên
độc lập phân phối đều trong khoảng (0, 1).
2. Với x0 bất kỳ, số lượng những biến số có thể được tạo ra là lớn
trước khi xảy ra sự lặp lại.
3. Những giá trò có thể được tính một cách hiệu quả bằng máy tính.
Một nguyên tắc giúp thỏa mãn 3 điều kiện trên là m nên được chọn
là số nguyên tố lớn, số đó phù hợp với kích cỡ dữ liệu của máy tính.
Ví dụ, với máy tính 32 bit, chọn m = 231 − 1 và a = 75 = 16.807, với
máy tính 36 bit, chọn m = 235 − 31 và a = 55 . Hai cách chọn a và m
đó đều cho kết quả tốt.
Một cách khác để tạo số giả ngẫu nhiên bằng cách tính toán đệ quy
xn = (axn−1 + c)

mod m

Phương pháp này gọi là phương pháp đồng dư hỗn tạp (bao gồm một
phép nhân và một phép cộng). Khi sử dụng cách này, m được chọn

5


1.2. SỬ DỤNG SỐ NGẪU NHIÊN ĐỂ TÍNH TÍCH PHÂN

bằng kích thước dữ liệu của máy tính, khi đó việc tính (axn−1 + c)
mod m, tức là chia (axn−1 + c) cho m, sẽ khá hiệu quả.
Vậy điểm bắt đầu trong mô phỏng máy tính của hệ thống, chúng
ta giả sử rằng có thể tạo một dãy số giả ngẫu nhiên xấp xỉ giá trò của
những biến ngẫu nhiên độc lập và có phân phối đều trong khoảng
(0, 1).

1.2 Sử dụng số ngẫu nhiên để tính tích phân
Một trong những ứng dụng gần nhất của số ngẫu nhiên là tính tích
phân.
Đặt g(x) là một hàm số và giả sử ta cần tính θ với
1

g(x)dx

θ=
0

Lưu ý, biến ngẫu nhiên U có phân phối đều trên (0, 1), nên
θ = E[g(U )]
Nếu U1 , . . . , Uk là những biến ngẫu nhiên độc lập, có phân phối đều
trên (0, 1) thì dẫn đến những biến ngẫu nhiên g(U1), . . . , g(Uk ) cũng
độc lập, có cùng phân phối, có kỳ vọng là θ. Do đó, theo luật mạnh số
lớn Kolmogorov, với xác suất 1,
k


i=1

g(Ui )
→ E[g(U )] = θ, khi k → ∞
k

Vì vậy, ta xấp xỉ θ bằng cách tạo ra một số lớn những số ngẫu nhiên
ui và tính trung bình cộng của g(ui ). Phương pháp để xấp xỉ tích phân
như vậy gọi là phương pháp Monte Carlo.
6


1.2. SỬ DỤNG SỐ NGẪU NHIÊN ĐỂ TÍNH TÍCH PHÂN

Nếu ta muốn tính
b

g(x)dx

θ=
a

thì, bằng cách thay
dx
x−a
và dy =
b−a
b−a


y=
ta được,

1

θ =

g(a + [b − a]y)(b − a)dy
0
1

=

h(y)dy
0

với h(y) = (b − a)g(a + [b − a]y). Do đó, ta có thể xấp xỉ θ bằng cách
tạo số ngẫu nhiên, sau đó tính giá trò trung bình của h.
Tương tự, nếu muốn tính


g(x)dx

θ=
0

thì, bằng cách thay
y=

dx

1
và dy = −
= −y 2 dx
2
x+1
(x + 1)

thu được
1

h(y)dy

θ=
0

với
g
h(y) =

1
y

−1

y2

Việc sử dụng số ngẫu nhiên để xấp xỉ tích phân trở nên rõ ràng hơn
trong trường hợp tích phân nhiều chiều.
Giả sử g là hàm của n biến và ta muốn tính
1


1

1

...

θ=
0

0

g(x1 , . . . , xn )dx1 dx2 . . . dxn
0

7


1.2. SỬ DỤNG SỐ NGẪU NHIÊN ĐỂ TÍNH TÍCH PHÂN

Sử dụng phương pháp Monter Carlo để ước lượng θ, θ biểu diễn theo
kỳ vọng:
θ = E[g(U1, . . . , Un )]
với U1, . . . , Un là những biến ngẫu nhiên độc lập, có phân phối đều
trên khoảng (0, 1). Do đó, nếu tạo k tập độc lập, mỗi tập chứa n biến
số ngẫu nhiên độc lập có phân phối đều trong khoảng (0, 1)
U11 , . . . , Un1
U12 , . . . , Un2
..
.

U1k , . . . , Unk
thì, vì những biến số ngẫu nhiên g(U1i , . . . , Uni ), i = 1, . . . , k là những
biến số ngẫu nhiên độc lập và có cùng phân phối với kỳ vọng θ, ta có
thể ước lượng θ bởi

k
i=1

g(U1i , . . . , Uni )/k.

Ví dụ 1a Ước lượng π
Giả sử vectơ ngẫu nhiên (X, Y ) có phân phối đều thuộc hình vuông
có diện tích là 4, tâm O. Nghóa là, nó là một điểm ngẫu nhiên trong
miền chỉ đònh như hình

Ta xem xét xác suất để điểm ngẫu nhiên nằm trong hình tròn có bán
kính 1.
8


1.2. SỬ DỤNG SỐ NGẪU NHIÊN ĐỂ TÍNH TÍCH PHÂN

Lưu ý, vì (X, Y ) có phân phối đều thuộc hình vuông nên
P {(X, Y )thuộc hình tròn} = P {X 2+Y 2 ≤ 1} =

π
diện tích hình tròn
=
diện tích hình vuông
4


Vậy, nếu ta tạo một số lượng lớn những điểm ngẫu nhiên độc lập trong
hình vuông, thì tỷ lệ những điểm rơi vào trong hình tròn xấp xỉ π/4.
Nếu X và Y độc lập và có phân phối đều trên (−1, 1) thì hàm mật độ
đồng thời của chúng là
f (x, y) = f (x)f (y)
1 1
·
=
2 2
1
= , −1 ≤ x ≤ 1, −1 ≤ y ≤ 1
4
Vì hàm mật độ của (X, Y ) là hằng số trong hình vuông nên (X, Y ) có
phân phối đều trong hình vuông. Nếu U có phân phối đều trên (0, 1)
thì 2U có phân phối đều trên (0, 2), 2U − 1 có phân phối đều trên
(−1, 1). Do đó, nếu ta tạo số ngẫu nhiên U1 và U2 , đặt
X = 2U1 − 1

Y = 2U2 − 1
và đònh nghóa


 1 nếu X 2 + Y 2 ≤ 1
I=
 0 nếu X 2 + Y 2 > 1
9


1.2. SỬ DỤNG SỐ NGẪU NHIÊN ĐỂ TÍNH TÍCH PHÂN


thì
E[I] = P {X 2 + Y 2 ≤ 1} =
Ta có thể ước lượng

π
4

π
4

bằng cách tạo một số lượng lớn các cặp số

ngẫu nhiên u1 , u2 và lấy ước lượng

π
4

là tỉ lệ những cặp thỏa điều kiện

(2u1 − 1)2 + (2u2 − 1)2 ≤ 1.✷
Bây giờ, chúng ta sẽ sử dụng phần mềm R để tạo 5, 10, 20, 30, 100, 1000,
2000, 5000, 10000, 20000 cặp (u1 , u2 ) và cho xấp xỉ π4 .
Cách thực hiện:
Bước 1: Tạo số giả ngẫu nhiên u bằng phương pháp đồng dư nhân
> u < − function(n, x0 , a, b){
+ x = vector()
+ x[1] = x0
+ for(i in 2:(n+1)){
+ x[i] = (a*x[i−1] + b)%% m

+}
+ u = x/m
}
Bước 2: Lập hàm để ước lượng π
> pi < − function(n) {
+ u1 = u(n, 1, 62089911, 0, (23 1 − 1))
+ u2 = u (n, 20, 950706376, 0 (23 1 − 1))
+ X = 2*u1 − 1
+ Y = 2*u2 − 1
+ dem = 0
+ for(i in 1:n) if ((X[i]2 + Y [i]2 ) <=1) dem = dem+1
+UL.pi = (dem/n)*4
10


1.2. SỬ DỤNG SỐ NGẪU NHIÊN ĐỂ TÍNH TÍCH PHÂN

+}
> comau < − c(5, 10, 20, 30, 100, 1000, 2000, 5000, 8000, 10000)
> vector.pi = vector()
> for (i in 1:10) vector.pi[1] = pi(comau[i])
> ketqua = data.frame(comau, uocluongpi = vector.pi)
> ketqua
Ta thu bảng kết quả:

Thứ tự Cỡ mẫu Ước lượng π
1

5


2.400000

2

10

3.200000

3

20

3.200000

4

30

2.933333

5

100

3.240000

6

1000


3.188000

7

2000

3.182000

8

5000

3.156000

9

8000

3.148000

10

10000

3.141200

Vậy, những số ngẫu nhiên được dùng để tạo giá trò của những biến ngẫu
nhiên có phân phối đều trên khoảng (0, 1). Trong chương 2 và chương
3, ta sẽ chỉ ra cách tạo giá trò của những biến ngẫu nhiên có phân phối
tùy ý. Với khả năng tạo những biến ngẫu nhiên tùy ý, chúng ta có thể

mô phỏng một hệ thống xác suất dựa theo những luật xác suất đặc biệt
của hệ thống.

11


1.2. SỬ DỤNG SỐ NGẪU NHIÊN ĐỂ TÍNH TÍCH PHÂN

Tóm lại:
1. Số ngẫu nhiên là giá trò của một biến số ngẫu nhiên có phân phối
đều trong khoảng (0, 1)
2. Trên kia ta đã viết chương trình để tạo số giả ngẫu nhiên bằng
phương pháp đồng dư nhân. Nhưng ta có thể sử dụng phần mềm
R tạo một bảng (như vậy ta không cần viết chương trình), chẳng
hạn 100 số giả ngẫu nhiên. Điều đó được thực hiện như sau
> a < − runif (100, 0, 1)
Ta thu được kết quả:
[1] 0.64685455 0.56813518 0.01310113 0.03719130 0.36736502 0.79246644
[7] 0.08330369 0.69471548 0.39881159 0.06488116 0.25720255 0.58276105
[13] 0.06059768 0.28983387 0.62604603 0.11641082 0.52728074 0.16140588
[19] 0.42588437 0.56459504 0.33216915 0.72511491 0.81897664 0.89697262
[25] 0.12964291 0.41216471 0.07241111 0.80280630 0.63252749 0.71567041
[31] 0.38979689 0.60175087 0.30693749 0.35654652 0.70580510 0.11956308
[37] 0.89541510 0.02144025 0.87587759 0.44121202 0.23640527 0.89597584
[43] 0.50377715 0.67473187 0.28442915 0.02543864 0.92673379 0.59849827
[49] 0.26929012 0.79491624 0.99740126 0.91135547 0.78478369 0.57801871
[55] 0.86193855 0.61036586 0.97123924 0.05097668 0.14762933 0.49069004
[61] 0.23076945 0.17141441 0.10027468 0.05946695 0.46622265 0.53955876
[67] 0.47715556 0.45068294 0.05183658 0.86609686 0.39531198 0.64377106
[73] 0.59271736 0.73585303 0.28183141 0.26869297 0.22984851 0.67663815

[79] 0.46008849 0.56115071 0.99931049 0.34592967 0.12288660 0.73836654
[85] 0.28523355 0.70327833 0.81545314 0.30240532 0.95329407 0.44543651
[91] 0.36894471 0.05384451 0.79583392 0.34068628 0.27179555 0.57501137
12


1.2. SỬ DỤNG SỐ NGẪU NHIÊN ĐỂ TÍNH TÍCH PHÂN

[97] 0.98752256 0.64516183 0.85128559 0.31577016
Vẽ biểu đồ
> hist(a, main = "Histogram of creating 100 random numbers").

Ta tạo thêm một bảng 10000 số ngẫu nhiên bằng lệnh
> b < − runif (10000, 0, 1)
và vẽ biểu đồ biểu diễn những số ngẫu nhiên mới tạo
> hist(b, main = "Histogram of creating 10000 random numbers")

Qua hai biểu đồ trên, ta có nhận xét: Kiểm tra các dãy số giả ngẫu
nhiên có tuân theo luật phân phối đều trong khoảng (0, 1), ta chỉ cần
vẽ biểu đồ tần số của dãy biến ngẫu nhiên vừa tạo. Trong R, dùng
lệnh hist() để vẽ biểu đồ tần số.
13


1.3. BẢNG SỐ NGẪU NHIÊN

1.3 Bảng số ngẫu nhiên
Bảng số ngẫu nhiên đã được sử dụng cho các số liệu thống kê cho các
công việc như chọn ngẫu nhiên các mẫu.
Các bảng số ngẫu nhiên gồm các chữ số từ 0 đến 9, với tần số xảy ra

xấp xỉ bằng nhau. Ở đây gồm 7 bảng .
Cách sử dụng bảng số ngẫu nhiên
• Bảng số ngẫu nhiên gồm 7 bảng (từ bảng 1 đến bảng 7). Chúng ta
có thể sử dụng ngày trong tuần để xác đònh bảng chọn lựa, hoặc
chọn bảng 1 cho thí nghiệm đầu tiên, bảng 2 cho thí nghiệm thứ
hai, . . .
• Chọn ngẫu nhiên một điểm trong bảng để bắt đầu tra (có thể
nhắm mắt lại và di chuyển đầu bút chì đến một vò trí bất kỳ trong
bảng tra, điểm bắt đầu tra là điểm ở ngay đầu bút chì).
• Chọn hướng để tra: có thể chọn một trong các hướng sau đây
+ Từ trên xuống dưới (theo cột)
+ Từ dưới lên trên (theo cột)
+ Từ trái qua phải (theo dòng)
+ Từ phải qua trái (theo dòng)
+ ...
Khi đã chuyển đến cuối một hàng hoặc cuối một cột thì phải chuyển
sang cột mới hoặc hàng mới (không được lựa chọn một cột hoặc một
hàng từ hai lần trở lên.)
14


1.3. BẢNG SỐ NGẪU NHIÊN

Ví dụ: Tạo kết quả gieo xúc xắc 11 lần.
Như đã biết khi gieo xúc xắc có thể xuất hiện một trong các mặt sau
A = { 1 chấm, 2 chấm, 3 chấm, 4 chấm, 5 chấm, 6 chấm }
Ta dùng bảng số ngẫu nhiên để thực hiện thí nghiệm này.
Hôm nay là thứ năm nên ta chọn bảng 5
Chọn ngẫu nhiên dòng 6 cột 7: Ta thực hiện tra theo cột (từ trên xuống
dưới), bỏ qua những số nhỏ hơn 1 và lớn hơn 6. Ta được kết quả

{ 4, 2, 2, 6, 4, 1, 4, 2, 5, 3, 4 }
Hoặc ta thực hiện tra theo dòng. Ta được kết quả
{ 4, 1, 2, 1, 2, 6, 1, 2, 4, 6, 5 }
Xem bảng số ngẫu nhiên trong phần Phụ lục, trang 100.

15


Chương 2
TẠO BIẾN NGẪU NHIÊN RỜI RẠC

2.1 Phương pháp biến đổi ngược
Yêu cầu:
Tạo giá trò của một biến ngẫu nhiên rời rạc X có hàm phân phối xác
suất
P {X = xj } = pj , j = 0, 1, . . . ,

pj = 1
j

Thực hiện
Đầu tiên tạo một số ngẫu nhiên U , U có phân phối đều trên (0, 1) và
đặt




x0 nếu U < p0







x nếu p0 ≤ U < p0 + p1


 1
..
X=
.





xj nếu j−1

i=0 pi ≤ U <




 ...

j
i=0 pi

Vậy, với 0 < a < b < 1, P {a ≤ U < b} = b − a, ta có
j−1


P {X = xj } = P

j

pi ≤ U <
i=0

16

pi
i=0

= pj


2.1. PHƯƠNG PHÁP BIẾN ĐỔI NGƯC

Do đó, X có phân phối như mong muốn.
Chú thích
1. Thuật toán (đã biết các xác suất p0 , p1 , . . . và các giá trò x0 , x1 , . . . )
Tạo một số ngẫu nhiên U
Nếu U < p0 đặt X = x0 và dừng
Nếu p0 ≤ U < p0 + p1 đặt X = x1 và dừng
Nếu p0 + p1 ≤ U < p0 + p1 + p2 đặt X = x2 và dừng
..
.

2. Nếu xi , i ≥ 0, x0 < x1 < x2 < . . . được sắp thứ tự và đặt F là hàm
phân phối của X, tức F (x) = P (X < x) thì F (xk ) = P (X < xk ) =

k−1
i=0 pi ,


nếu F (xj ) ≤ U < F (xj+1 ) thì X = xj

Mặt khác, sau khi tạo số ngẫu nhiên U , ta xác đònh giá trò của X
bằng cách tìm khoảng [F (xj ), F (xj+1 )) với U cho trước. Phương
pháp này gọi là phương pháp biến đổi ngược cho trường hợp tạo
biến ngẫu nhiên rời rạc.✷
Thời gian cần thiết để tạo biến ngẫu nhiên rời rạc bằng phương
pháp biến đổi ngược tỷ lệ với số khoảng cần tìm. Vì vậy nên xem
xét các giá trò xj của X theo thứ tự các pj giảm dần.
Ví dụ 2a

Mô phỏng một biến ngẫu nhiên rời rạc X như sau

p1 = 0.20, p2 = 0.15, p3 = 0.25, p4 = 0.40 với pj = P {X = j}.
Ta tạo số ngẫu nhiên U ,
17


2.2. TẠO HOÁN VỊ NGẪU NHIÊN VÀ ỨNG DỤNG TRONG Y KHOA.

Nếu U < 0.2 đặt X = 1 và dừng
Nếu 0.2 ≤ U < 0.35 đặt X = 2 và dừng
Nếu 0.35 ≤ U < 0.60 đặt X = 3 và dừng
Nếu 0.60 ≤ U đặt X = 4
Tuy nhiên có một phương pháp hiệu quả hơn như sau
Nếu U < 0.40 đặt X = 4 và dừng

Nếu 0.40 ≤ U < 0.65 đặt X = 3 và dừng
Nếu 0.65 ≤ U < 0.85 đặt X = 1 và dừng
Nếu 0.85 ≤ U đặt X = 2.✷
Trường hợp đặc biệt: Không cần tìm khoảng chứa số ngẫu nhiên khi
biến ngẫu nhiên cần tìm có phân phối rời rạc đồng đều. Nghóa là, giả
sử cần tạo giá trò của X , X nhận với cùng xác suất một trong các giá trò
1, 2, . . . , n. Tức, P {X = j} = 1/n, j = 1, . . . , n. Đầu tiên, tạo số ngẫu
nhiên U và đặt
X = j nếu

j
j−1
≤U<
n
n

Nên X = j nếu j − 1 ≤ nU < j; hoặc,
X = Int(nU ) + 1
với Int(x) ký hiệu là [x] là phần nguyên của x (x − 1 < Int(x) ≤ x).

2.2 Tạo hoán vò ngẫu nhiên và ứng dụng trong y khoa.
Ví dụ 2b. Tạo một hoán vò ngẫu nhiên
Yêu cầu: Tạo một hoán vò của các số 1, 2, ..., n
18


2.2. TẠO HOÁN VỊ NGẪU NHIÊN VÀ ỨNG DỤNG TRONG Y KHOA.

Thuật toán
Lần 1: chọn một số ngẫu nhiên trong 1, 2, . . . , n và đặt vào vò trí thứ n.

Lần 2: chọn một số ngẫu nhiên từ n − 1 số còn lại và đặt vào vò trí
n − 1.
..
.
Tuy nhiên, như vậy chúng ta không biết chính xác được số còn lại nào
được đặt vào vò trí. Một cách hiệu quả và thuận lợi hơn là đưa những
số đó vào một danh sách có thứ tự và chọn ngẫu nhiên vò trí của con
số đó. Nghóa là, với sắp xếp ban đầu P1 , P2, . . . , Pn , chúng ta chọn ngẫu
nhiên một trong những vò trí thứ 1, 2, . . . , n và sau đó thay đổi số trong
vò trí đó với một số ở vò trí n. Tiếp theo, chọn một trong những vò trí
thứ 1, 2, . . . , n − 1 , sau đó thay đổi số trong vò trí đó với một số ở vò trí
n − 1, và tiếp tục đến khi kết thúc.
Chú ý, có thể xem 0 ≤ U < 1, cho nên Int(kU ) + 1 nhận giá trò bất kỳ
trong các giá trò 1, 2, . . . , k.
Thuật toán tạo một hoán vò ngẫu nhiên:
Bước 1: Đặt P1 , P2 , . . . , Pn là hoán vò bất kỳ của 1, 2, . . . , n (có thể chọn
Pj = j, j = 1, 2, . . . , n)
Bước 2: Đặt k = n
Bước 3: Tạo một số ngẫu nhiên U và đặt I = Int(kU ) + 1
Bước 4: Đánh tráo giá trò của PI và Pk
Bước 5: Đặt k = k − 1 và nếu k > 1, quay lại bước 3.
Bước 6: P1, P2 , . . . , Pn là hoán vò ngẫu nhiên mong muốn.
Ví dụ: Trường hợp n = 4 và hoán vò ban đầu là 1, 2, 3, 4
Đầu tiên, đặt k = 4
Giá trò đầu tiên của I (I nhận các giá trò đồng khả năng 1, 2, 3, 4) là
19


2.2. TẠO HOÁN VỊ NGẪU NHIÊN VÀ ỨNG DỤNG TRONG Y KHOA.


I = 3 chẳng hạn, phần tử ở vò trí 3 và 4 được đổi chỗ nên có hoán vò
mới là 1, 2, 4, 3.
Tiếp theo, I = Int(3U ) + 1, giả sử I = 2, phần tử ở vò trí 2 và 3 sẽ được
đổi chỗ, hoán vò mới là 1, 4, 2, 3 .
Nếu giá trò cuối cùng (lúc này k = 2 và I = Int(2U ) + 1) của I là I = 2,
thì hoán vò cuối cùng là 1, 4, 2, 3 và đây chính là giá trò của hoán vò
ngẫu nhiên.✷
Một tính chất quan trọng của thuật toán trên là còn tạo được một
tập con ngẫu nhiên với kích thước r, 1 ≤ r ≤ n. Chỉ áp dụng thuật
toán khi vò trí n, n − 1, . . . , n − r + 1 được lấp đầy. Những phần tử trong
những vò trí này thiết lập tập con ngẫu nhiên cần tìm. (Ở đây ta có
thể giả sử r ≤ n/2 vì nếu r > n/2 thì có thể chọn một tập con ngẫu
nhiên có kích thước n − r và đặt những phần tử không nằm trong tập
con này là một tập con ngẫu nhiên có kích thước r.)
Ứng dụng trong y khoa.
Tạo một tập con ngẫu nhiên rất quan trọng trong các phép thử thuộc
y khoa. Ví dụ, một trung tâm y khoa có kế hoạch kiểm tra một loại
thuốc mới làm giảm lượng chất béo trong máu. Để kiểm tra hiệu quả
của nó, trung tâm đã tuyển 1000 người tình nguyện để kiểm tra. Hàm
lượng chất béo trong máu của họ có thể bò ảnh hưởng bởi những nhân
tố bên ngoài khi kiểm tra (như thay đổi điều kiện thời tiết), dẫn đến
quyết đònh chia người tình nguyện thành hai nhóm, nhóm thử gồm
có 500 người, nhóm đối chứng còn lại 500 người sẽ dùng thuốc trấn
an (placebo). Những người tình nguyện và người chòu trách nhiệm đưa
thuốc đều không được biết ai thuộc nhóm nào (kiểm đònh hai chiều
bí mật). Vậy phải xác đònh nhóm những người tình nguyện được làm
20


2.2. TẠO HOÁN VỊ NGẪU NHIÊN VÀ ỨNG DỤNG TRONG Y KHOA.


nhóm thử.
Ở đây, ta xác đònh yêu cầu của bài toán: "Có 1000 người mang mã số
từ 1 đến n = 1000. Ta chia 1000 người này thành 2 nhóm, mỗi nhóm
có 500 người để thực hiện cuộc thí nghiệm"
Thực hiện
Bước 1: Gán mã số từ 1 đến 1000, cho 1000 đối tượng được chọn để khảo
sát và đưa vào biến id.
> n < − 1000
> id < − c(1:n)
Bước 2: Dùng hàm runif để tạo một biến ngẫu nhiên mới với 1000 đối
tượng. Hàm runif cho ra số từ 0 đến 1 (với nhiều số thập phân), cho
nên chúng ta cần hoán chuyển thành số nguyên bằng cách nhân cho
1000 và sử dụng hàm as.integer
> random < − runif (n)
> int < − as.interger(random*1000)
Bước 3: Xác đònh int là số chẵn hay lẻ bằng hàm %% và cho vào biến
odd. Dùng hàm replace để chia nhóm: nếu odd là số lẻ, cho vào nhóm
A; nếu odd là số chẵn, cho vào nhóm B, và gọi nhóm bằng tên mới là
group
> odd < − int %%2
> group < − odd
> group < − replace (group, odd ==1, "A")
> group < − replace (group, odd ==1, "B")
Bước 4: Dùng hàm data.frame để chứa tất cả số liệu có liên quan như
id và group vào một một dữ liệu có tên là grouping và in ra
> grouping < − data.frame(id, group)
21



2.2. TẠO HOÁN VỊ NGẪU NHIÊN VÀ ỨNG DỤNG TRONG Y KHOA.

> grouping
Để kiểm tra có bao nhiêu người trong nhóm A, bao nhiêu người trong
nhóm B, chúng ta sử dụng hàm table như sau
> table(group)
Vì phân chia hoàn toàn ngẫu nhiên nên số lượng người trong mỗi nhóm
không hoàn toàn cân đối. Do đó, ta phải chạy "lặp lại các câu lệnh
trên" cho đến khi số lượng ở hai nhóm cân bằng thì ngưng.
Tóm lại, để tạo bảng gồm 500 mã số của những người lập thành nhóm
thử thuốc ta thực hiện như sau
> n < − 1000
> id < − 1:n
> random < − runif(n)
> int < − as.integer(random*1000)
> odd < − int> group < − odd
> group < − replace(group,odd==1,"A")
> group < − replace(group,odd==0,"B")
> grouping < − data.frame(id, group)
> table(group)
Sau một số bước lặp ta thu được kết quả
> n < − 1000
> id < − 1:n
> random < − runif(n)
> int < − as.integer(random*1000)
> group < − odd
> group < − replace(group,odd==1,"A")
> group < − replace(group,odd==0,"B")
22



2.2. TẠO HOÁN VỊ NGẪU NHIÊN VÀ ỨNG DỤNG TRONG Y KHOA.

> grouping < − data.frame(id, group)
> table(group)
group
AB
500 500
Khi đã đạt yêu cầu, chúng ta in ra kết quả bằng lệnh grouping
> grouping
id

group

1

1

B

2

2

B

3

3


B

4

4

B

5

5

A

6
..
.

6
..
.

A
..
.

995

995


B

996

996

B

997

997

B

998

998

B

999

999

A

1000 1000

B


Chú ý:
Cột 1 ghi số thứ tự.
Cột 2 ghi mã số của từng người từ 1 đến 1000.

23


×