Andere Antworten hier haben sich auf das allgemeine Auftreten verschiedener Buchstaben in der Sequenz konzentriert, was ein Aspekt der erwarteten "Zufälligkeit" sein kann. Ein weiterer interessanter Aspekt ist jedoch die offensichtliche Zufälligkeit in der Reihenfolge der Buchstaben in der Sequenz. Zumindest würde ich denken, dass "Zufälligkeit" die Austauschbarkeit des Buchstabenvektors beinhaltet, die mit einem "Lauftest" getestet werden kann. Der Lauftest zählt die Anzahl der "Läufe" in der Sequenz und vergleicht die Gesamtzahl der Läufe mit ihrer Nullverteilung unter der Nullhypothese der Austauschbarkeit für einen Vektor mit denselben Buchstaben. Die genaue Definition eines "Laufs" hängt vom jeweiligen Test ab (siehe z. B. eine ähnliche Antwort hier)), aber in diesem Fall besteht die natürliche Definition bei nominalen Kategorien darin, jede aufeinanderfolgende Sequenz, die nur aus einem Buchstaben besteht, als einen einzigen "Lauf" zu zählen.
Zum Beispiel Ihre Sequenz BABD-CABC-DACD-BACD
sieht prima facie nicht zufällig zu mir (kein Brief erscheint mit sich, die für eine Folge dieses lange wahrscheinlich ungewöhnlich ist). Um dies formal zu testen, können wir einen Lauftest auf Austauschbarkeit durchführen. In dieser Sequenz haben wir Buchstaben (vier von jedem Buchstaben) und es gibt Läufe, die jeweils aus einer einzelnen Instanz eines Buchstabens bestehen. Die beobachtete Anzahl von Läufen kann unter der Hypothese der Austauschbarkeit mit ihrer Nullverteilung verglichen werden. Wir können dies über eine Simulation tun, die eine simulierte Nullverteilung und einen p-Wert für den Test ergibt. Das Ergebnis für diese Zeichenfolge ist in der folgenden Grafik dargestellt.†n=16r=16
Für diese Sequenz beträgt der p-Wert für den (unter der Nullhypothese der Austauschbarkeit) . Dies ist bei einem Signifikanzniveau von 10% signifikant, jedoch nicht bei einem Signifikanzniveau von 5%. Es gibt einige Hinweise auf eine nicht austauschbare Reihe (dh nicht zufällige Reihenfolge), aber die Hinweise sind nicht besonders stark. Bei einer länger beobachteten Zeichenfolge hätte der Lauftest eine größere Leistung, um eine austauschbare Zeichenfolge von einer nicht austauschbaren Zeichenfolge zu unterscheiden. (Wie Sie sehen können, kann mein anfängliches Anscheinsurteil, dass diese Zeichenfolge nicht zufällig ist, falsch sein - der p-Wert ist tatsächlich nicht so niedrig, wie ich es erwartet hatte.)p=0.0537
Schließlich ist zu beachten, dass bei diesem Test nur die Zufälligkeit der Reihenfolge der Buchstaben in der Zeichenfolge berücksichtigt wird. Dabei wird die Anzahl der Buchstaben jedes Typs als feste Eingabe verwendet. Dieser Test wird nicht Zufälligkeit im Sinne von nicht erkennen Austauschbarkeit der Buchstaben in der Zeichenkette, aber es wird nicht testen „Zufälligkeit“ im Sinne der Gesamtwahrscheinlichkeiten der verschiedenen Buchstaben. Wenn letzteres auch Teil der angegebenen Bedeutung von "Zufälligkeit" ist, könnte dieser Lauftest durch einen anderen Test ergänzt werden, der die Gesamtzahl der Buchstaben betrachtet und diese mit einer hypothetischen Nullverteilung vergleicht.
R-Code: Das obige Diagramm und der p-Wert wurden unter Verwendung des folgenden R
Codes erzeugt:
#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');
† Ich habe die Sequenz nur mit Bindestrichen aufgebrochen, um das Lesen zu erleichtern. Die Striche haben für die Analyse keine Bedeutung.