Diskussion
Ein Permutationstest generiert alle relevanten Permutationen eines Datensatzes, berechnet für jede dieser Permutationen eine festgelegte Teststatistik und bewertet die tatsächliche Teststatistik im Kontext der resultierenden Permutationsverteilung der Statistiken. Eine übliche Methode zur Bewertung besteht darin, den Anteil der Statistiken zu melden, der (in gewissem Sinne) "als oder extremer" als die tatsächliche Statistik ist. Dies wird oft als "p-Wert" bezeichnet.
Da es sich bei dem tatsächlichen Datensatz um eine dieser Permutationen handelt, gehört seine Statistik zwangsläufig zu denjenigen, die in der Permutationsverteilung zu finden sind. Daher kann der p-Wert niemals Null sein.
Sofern der Datensatz nicht sehr klein ist (normalerweise weniger als 20-30 Gesamtzahlen) oder die Teststatistik eine besonders schöne mathematische Form hat, ist es nicht praktikabel, alle Permutationen zu generieren. (Ein Beispiel, in dem alle Permutationen generiert werden, wird unter Permutationstest in R angezeigt .) Daher werden Computerimplementierungen von Permutationstests normalerweise aus der Permutationsverteilung entnommen . Sie erzeugen dazu einige unabhängige zufällige Permutationen und hoffen, dass die Ergebnisse eine repräsentative Stichprobe aller Permutationen sind.
Daher sind alle von einer solchen Stichprobe abgeleiteten Zahlen (wie z. B. ein "p-Wert") nur Schätzer für die Eigenschaften der Permutationsverteilung. Es ist durchaus möglich - und häufig bei großen Effekten -, dass der geschätzte p-Wert Null ist. Daran ist nichts auszusetzen, aber es wirft sofort die bisher vernachlässigte Frage auf, inwieweit der geschätzte p-Wert vom richtigen Wert abweichen kann. Da die Stichprobenverteilung eines Anteils (z. B. ein geschätzter p-Wert) binomisch ist, kann dieser Unsicherheit mit einem binomischen Konfidenzintervall begegnet werden .
Die Architektur
Eine gut aufgebaute Implementierung wird die Diskussion in jeder Hinsicht genau verfolgen. Es würde mit einer Routine beginnen, die Teststatistik zu berechnen, da diese die Mittelwerte von zwei Gruppen vergleicht:
diff.means <- function(control, treatment) mean(treatment) - mean(control)
Schreiben Sie eine weitere Routine, um eine zufällige Permutation des Datensatzes zu generieren und die Teststatistik anzuwenden. Die Schnittstelle zu dieser ermöglicht es dem Aufrufer, die Teststatistik als Argument anzugeben. Es werden die ersten m
Elemente eines Arrays (vermutlich eine Referenzgruppe) mit den verbleibenden Elementen (der "Behandlungs" -Gruppe) verglichen .
f <- function(..., sample, m, statistic) {
s <- sample(sample)
statistic(s[1:m], s[-(1:m)])
}
Die Permutation Test wird bestimmt, indem die Statistik für die eigentlichen Daten zuerst durchgeführt (hier angenommen , in zwei Arrays gespeichert werden control
und treatment
) und dann Statistiken für viele unabhängigen Zufälle Permutationen davon zu finden:
z <- stat(control, treatment) # Test statistic for the observed data
sim<- sapply(1:1e4, f, sample=c(control,treatment), m=length(control), statistic=diff.means)
Berechnen Sie nun die Binomialschätzung des p-Wertes und ein Konfidenzintervall dafür. Eine Methode verwendet die binconf
in das HMisc
Paket integrierte Prozedur :
require(Hmisc) # Exports `binconf`
k <- sum(abs(sim) >= abs(z)) # Two-tailed test
zapsmall(binconf(k, length(sim), method='exact')) # 95% CI by default
Es ist keine schlechte Idee, das Ergebnis mit einem anderen Test zu vergleichen, auch wenn bekannt ist, dass dies nicht ganz zutreffend ist: Zumindest könnte man eine Größenordnung erkennen, wo das Ergebnis liegen sollte. In diesem Beispiel (zum Vergleichen der Mittelwerte) liefert ein Student-T-Test normalerweise trotzdem ein gutes Ergebnis:
t.test(treatment, control)
Diese Architektur wird in einer komplexeren Situation mit R
Arbeitscode unter Testen, ob Variablen der gleichen Verteilung folgen dargestellt .
Beispiel
100201.5
set.seed(17)
control <- rnorm(10)
treatment <- rnorm(20, 1.5)
Nachdem ich mit dem obigen Code einen Permutationstest durchgeführt hatte, zeichnete ich die Stichprobe der Permutationsverteilung zusammen mit einer vertikalen roten Linie auf, um die tatsächliche Statistik zu markieren:
h <- hist(c(z, sim), plot=FALSE)
hist(sim, breaks=h$breaks)
abline(v = stat(control, treatment), col="Red")
Die Berechnung der Binomialvertrauensgrenze ergab
PointEst Lower Upper
0 0 0.0003688199
00,000373.16e-05
0,000370,000370,050,010,001
Bemerkungen
kN k / N( k + 1 ) / ( N+ 1 )N
10102= 1000,0000051.611.7parts per million: etwas kleiner als der angegebene Student-T-Test. Obwohl die Daten mit normalen Zufallszahlengeneratoren generiert wurden, was die Verwendung des Student-T-Tests rechtfertigen würde, weichen die Ergebnisse des Permutationstests von den Ergebnissen des Student-T-Tests ab, da die Verteilungen innerhalb der einzelnen Beobachtungsgruppen nicht völlig normal sind.
a.random
b.random
b.random
a.random
coding
lncrna