Một chương trình năng động sẽ làm cho công việc ngắn này.
Giả sử chúng ta quản lý tất cả các câu hỏi cho học sinh và sau đó chọn ngẫu nhiên một tập hợp con I của k=10 ra khỏi tất cả n=100câu hỏi Hãy xác định một biến ngẫu nhiênXi để so sánh hai học sinh trong câu hỏi i: đặt nó thành 1 nếu học sinh A đúng và học sinh B thì không, −1 nếu học sinh B đúng và học sinh A không, và 0nếu không thì. Tổng số
XI=∑i∈IXi
là sự khác biệt về điểm số cho các câu hỏi trong I. Chúng tôi muốn tính toán Pr(XI>0). Xác suất này được thực hiện trên phân phối chung của vàIXi.
Hàm phân phối của dễ dàng được tính toánXi theo giả định mà học sinh trả lời độc lập:
Pr(Xi=1)Pr(Xi=−1)Pr(Xi=0)=Pai(1−Pbi)=Pbi(1−Pai)=1−Pr(Xi=1)−Pr(Xi=0).
Là một tốc ký, chúng ta hãy gọi các xác suất này và . Viếtai, bi,di,
fi(x)=aix+bix−1+di.
Đa thức này là hàm tạo xác suất choXi.
Hãy xem xét hàm hợp lý
ψn(x,t)=∏i=1n(1+tfi(x)).
(Trên thực tế, là một đa thức: đó là một hàm hữu tỷ khá đơn giản.) xnψn(x,t)
Khi được mở rộng dưới dạng đa thức tính bằng , hệ số của bao gồm tổng của tất cả các sản phẩm có thể có của khác biệt Đây sẽ là một hàm hợp lý với các hệ số khác không chỉ cho các lũy thừa của từ đếnVì được chọn ngẫu nhiên một cách ngẫu nhiên, nên các hệ số của các lũy thừa này của khi được chuẩn hóa thành tổng thể, đưa ra hàm tạo xác suất cho sự khác biệt về điểm số. Các quyền hạn tương ứng với kích thước củaψnttkkfi(x).xx−kxk. Ix,I.
Điểm của phân tích này là chúng ta có thể tính toán một cách dễ dàng và với hiệu quả hợp lý:ψ(x,t) chỉ cần nhân các đa thức theo tuần tự. Làm điều này đòi hỏi phải giữ lại các hệ số của trong cho(tất nhiên chúng ta có thể bỏ qua tất cả các quyền hạn cao hơn của xuất hiện trong bất kỳ sản phẩm bộ phận nào này). Theo đó, tất cả các thông tin cần thiết được mang theo có thể được biểu thị bằng ma trận , với các hàng được lập chỉ mục bởi các quyền hạn của (từ đến ) và các cột được lập chỉ mục bởin1,t,…,tkψj(x,t)j=0,1,…,n.tψj(x,t)2k+1×n+1x−kk0 đến .k
Mỗi bước tính toán đòi hỏi công việc tỷ lệ thuận với kích thước của ma trận này, tỷ lệ là Kế toán cho số bước, đây là thuật toán không gian , . Điều đó làm cho nó khá nhanh cho nhỏ Tôi đã chạy nó trong (không được biết đến với tốc độ quá cao) cho lên tới và lên đến trong đó mất chín giây (trên một lõi). Trong cài đặt câu hỏi với và quá trình tính toán mất giây.O(k2).O(k2n)O(kn)k.R
k100n105,n=100k=10,0.03
Dưới đây là một ví dụ trong đó là các giá trị ngẫu nhiên đồng nhất giữa và và là các bình phương của chúng (luôn nhỏ hơn , do đó rất ủng hộ học sinh A). Tôi đã mô phỏng 100.000 bài kiểm tra, như được tóm tắt bằng biểu đồ này của điểm số mạng:Pai01PbiPai
Các thanh màu xanh biểu thị những kết quả mà học sinh A đạt điểm cao hơn B. Các chấm đỏ là kết quả của chương trình động. Họ đồng ý tuyệt vời với mô phỏng ( thử nghiệm, ). Tổng hợp tất cả các xác suất dương cho câu trả lời trong trường hợp này làχ2p=51%0.7526….
Lưu ý rằng phép tính này mang lại nhiều hơn so với yêu cầu: nó tạo ra toàn bộ phân phối xác suất của chênh lệch điểm cho tất cả các bài kiểm tra của hoặc ít câu hỏi được chọn ngẫu nhiên.k
Đối với những người muốn thực hiện làm việc để sử dụng hoặc cổng, đây là R
mã tạo ra mô phỏng (được lưu trữ trong vectơ Simulation
) và thực hiện chương trình động (có kết quả trong mảng P
). Các repeat
khối ở cuối là chỉ có để tổng hợp tất cả các kết quả hiếm bất thường để các thử nghiệm trở nên rõ ràng là đáng tin cậy. (Trong hầu hết các tình huống, điều này không thành vấn đề, nhưng nó giữ cho phần mềm không bị phàn nàn.)χ2
n <- 100
k <- 10
p <- runif(n) # Student A's chances of answering correctly
q <- p^2 # Student B's chances of answering correctly
#
# Compute the full distribution.
#
system.time({
P <- matrix(0, 2*k+1, k+1) # Indexing from (-k,0) to (k,k)
rownames(P) <- (-k):k
colnames(P) <- 0:k
P[k+1, 1] <- 1
for (i in 1:n) {
a <- p[i] * (1 - q[i])
b <- q[i] * (1 - p[i])
d <- (1 - a - b)
P[, 1:k+1] <- P[, 1:k+1] +
a * rbind(0, P[-(2*k+1), 1:k]) +
b * rbind(P[-1, 1:k], 0) +
d * P[, 1:k]
}
P <- apply(P, 2, function(x) x / sum(x))
})
#
# Simulation to check.
#
n.sim <- 1e5
set.seed(17)
system.time(
Simulation <- replicate(n.sim, {
i <- sample.int(n, k)
sum(sign((runif(k) <= p[i]) - (runif(k) <= q[i]))) # Difference in scores, A-B
})
)
#
# Test the calculation.
#
counts <- tabulate(Simulation+k+1, nbins=2*k+1)
n <- sum(counts)
k.min <- 5
repeat {
probs <- P[, k+1]
i <- probs * n.sim >= k.min
z <- sum(probs[!i])
if (z * n >= 5) break
if (k.min * (2*k+1) >= n) break
k.min <- ceiling(k.min * 3/2)
}
probs <- c(z, probs[i])
counts <- c(sum(counts[!i]), counts[i])
chisq.test(counts, p=probs)
#
# The answer.
#
sum(P[(1:k) + k+1, k+1]) # Chance that A-B is positive