Các câu trả lời khác ở đây đã tập trung vào sự xuất hiện chung của các chữ cái khác nhau trong chuỗi, có thể là một khía cạnh của "tính ngẫu nhiên" dự kiến. Tuy nhiên, một khía cạnh quan tâm khác là sự ngẫu nhiên rõ ràng theo thứ tự các chữ cái trong chuỗi. Tối thiểu, tôi sẽ nghĩ rằng "tính ngẫu nhiên" đòi hỏi khả năng trao đổi của vectơ các chữ cái, có thể được kiểm tra bằng cách sử dụng "chạy thử". Phép thử chạy đếm số lần "chạy" trong chuỗi và so sánh tổng số lần chạy với phân phối null của nó theo giả thuyết null về khả năng trao đổi, cho một vectơ có cùng chữ cái. Định nghĩa chính xác về những gì cấu thành một "chạy" phụ thuộc vào thử nghiệm cụ thể (xem ví dụ, một câu trả lời tương tự ở đây), nhưng trong trường hợp này, với các danh mục danh nghĩa, định nghĩa tự nhiên là đếm bất kỳ chuỗi liên tiếp nào chỉ bao gồm một chữ cái là một "lần chạy" duy nhất.
Ví dụ, chuỗi của bạn BABD-CABC-DACD-BACD
trông prima facie không ngẫu nhiên đối với tôi (không có chữ cái nào xuất hiện với chính nó, điều này có lẽ không bình thường đối với một chuỗi dài như vậy).† Để kiểm tra điều này một cách chính thức, chúng tôi có thể thực hiện một bài kiểm tra khả năng trao đổi. Trong chuỗi này, chúng tôi cón=16 chữ cái (bốn của mỗi chữ cái) và có r=16chạy, mỗi bao gồm một trường hợp duy nhất của một chữ cái. Số lần chạy quan sát có thể được so sánh với phân phối null của nó theo giả thuyết về khả năng trao đổi. Chúng ta có thể thực hiện điều này thông qua mô phỏng, mang lại phân phối null mô phỏng và giá trị p cho thử nghiệm. Kết quả cho chuỗi ký tự này được hiển thị trong biểu đồ bên dưới.
Đối với chuỗi này, giá trị p cho thử nghiệm chạy (theo giả thuyết null về khả năng trao đổi) là p=0.0537. Điều này có ý nghĩa ở mức ý nghĩa 10%, nhưng không phải ở mức ý nghĩa 5%. Có một số bằng chứng cho thấy một loạt không thể trao đổi (nghĩa là thứ tự không ngẫu nhiên), nhưng bằng chứng không đặc biệt mạnh. Với chuỗi được quan sát lâu hơn, kiểm tra chạy sẽ có sức mạnh lớn hơn để phân biệt chuỗi có thể trao đổi với chuỗi không thể trao đổi. (Như bạn có thể thấy, phán đoán prima facie ban đầu của tôi rằng chuỗi này không ngẫu nhiên có thể sai - giá trị p không thực sự thấp như tôi mong đợi.)
Cuối cùng, điều quan trọng cần lưu ý là thử nghiệm này chỉ xem xét tính ngẫu nhiên của thứ tự các chữ cái trong chuỗi - nó lấy số lượng chữ cái của mỗi loại làm đầu vào cố định. Thử nghiệm này sẽ phát hiện tính không ngẫu nhiên theo nghĩa không thể trao đổi của các chữ cái trong chuỗi, nhưng nó sẽ không kiểm tra "tính ngẫu nhiên" theo nghĩa xác suất tổng thể của các chữ cái khác nhau. Nếu cái sau cũng là một phần của ý nghĩa "ngẫu nhiên" được chỉ định thì thử nghiệm chạy này có thể được tăng cường bằng một thử nghiệm khác xem xét tổng số các chữ cái và so sánh nó với phân phối null được giả thuyết.
Mã R: Biểu đồ và giá trị p ở trên được tạo bằng R
mã sau :
#Define the character string vector (as factors)
x <- factor(c(2,1,2,4, 3,1,2,3, 4,1,3,4, 2,1,3,4),
labels = c('A', 'B', 'C', 'D'))
#Define a function to calculate the runs for an input vector
RUNS <- function(x) { n <- length(x);
R <- 1;
for (i in 2:n) { R <- R + (x[i] != x[i-1]) }
R; }
#Simulate the runs statistic for k permutations
k <- 10^5;
set.seed(12345);
RR <- rep(0, k);
for (i in 1:k) { x_perm <- sample(x, length(x), replace = FALSE);
RR[i] <- RUNS(x_perm); }
#Generate the frequency table for the simulated runs
FREQS <- as.data.frame(table(RR));
#Calculate the p-value of the runs test
R <- RUNS(x);
R_FREQ <- FREQS$Freq[match(R, FREQS$RR)];
p <- sum(FREQS$Freq*(FREQS$Freq <= R_FREQ))/k;
#Plot estimated distribution of runs with test
library(ggplot2);
ggplot(data = FREQS, aes(x = RR, y = Freq/k, fill = (Freq <= R_FREQ))) +
geom_bar(stat = 'identity') +
geom_vline(xintercept = match(R, FREQS$RR)) +
scale_fill_manual(values = c('Grey', 'Red')) +
theme(legend.position = 'none',
plot.title = element_text(hjust = 0.5, face = 'bold'),
plot.subtitle = element_text(hjust = 0.5),
axis.title.y = element_text(margin = margin(t = 0, r = 10, b = 0, l = 0))) +
labs(title = 'Runs Test - Plot of Distribution of Runs under Exchangeability',
subtitle = paste0('(Observed runs is black line, p-value = ', p, ')'),
x = 'Runs', y = 'Estimated Probability');
†Tôi đã phá vỡ trình tự với dấu gạch ngang chỉ để dễ đọc hơn; dấu gạch ngang không có ý nghĩa đối với phân tích.