Es ist ziemlich klar, dass bei Ihrem Experiment etwas schief gelaufen ist. Insbesondere ist es wahrscheinlich, dass die Unterstützung der beiden von Ihnen generierten Distributionen nicht gleich ist und Sie daher ein ziemlich seltsames Ergebnis aus dem Chi-Quadrat-Test erhalten. Ein weiteres Problem besteht darin, dass der Chi-Quadrat-Test eine Verteilung mit einem unbekannten Satz von Frequenzen vergleichen soll, wenn beim Vergleich zweier Verteilungen die Variabilität aufgrund der Schätzung der Frequenzen von nicht berücksichtigt wird.X.
Im Allgemeinen sollten Sie ziemlich sicher sein, dass etwas schief gelaufen ist, wenn Sie Freiheitsgrade von NA und einen p-Wert von 1 erhalten.
Wenn Ihre beiden Zufallsvariablen tatsächlich stetig sind, sind die in den Kommentaren vorgeschlagenen Tests (Kolmogorov-Smirnoff usw.) am besten. Wenn die interessierenden Verteilungen diskret sind, kann ein Generalized-Likelihood-Ratio-Test gut funktionieren. Angenommen, wir beobachten zwei Zufallsvariablen, die jeweils Werte annehmen . Bezeichne mit , die Anzahl der Beobachtungen vom Typ die von aus beobachtet werden , die Anzahl der Beobachtungen vom Typ von und mit und die Gesamtzahl der Beobachtungen. Dann ist die Likelihood-Ratio-Statistik gegeben durch:
pxichi ∈ { 1 , . . . , p }ichxyichichynxny
2 log∏pi = 1(xichnx)xich(yichny)yich∏pi = 1(yich+xichny+nx)yich+xich∼χ2p - 1.
Diese Teststatistik vergleicht im Wesentlichen die Anpassung des Modells unter der Annahme von zwei unterschiedlichen Verteilungen mit dem Modell unter der Annahme einer einzigen Verteilung für die beiden Beobachtungssätze. Der vorgeschlagene Test wird im folgenden Code implementiert:
discreteLR <- function(x, y, exact = FALSE) {
if(length(x) != length(y)) stop("Length of x and y must be equal!")
nx <- sum(x)
ny <- sum(y)
loglikX <- sum(x * log(x / nx))
loglikY <- sum(y * log(y / ny))
joint <- sum((y + x) * log((y + x)/ (nx + ny)))
chisq <- 2 * (loglikX + loglikY - joint)
pval <- pchisq(chisq, length(x) - 1, lower.tail = FALSE)
return(c(chisqStat = chisq, pval = pval))
}
set.seed(1)
p <- runif(5)
p <- p / sum(p)
nx <- 100
ny <- 150
reps <- 10^3
x <- rmultinom(reps, nx, p)
y <- rmultinom(reps, ny, p)
pvalues <- numeric(reps)
exact <- numeric(reps)
for(i in 1:reps) {
pvalues[i] <- discreteLR(x[, i], y[, i])[2]
}
qqplot(qunif(ppoints(reps)), pvalues,
xlab = "uniform quantiles",
ylab = "simulated p-values")
abline(a = 0, b = 1)