Wie erstellen wir ein Konfidenzintervall für den Parameter eines Permutationstests?


9

Permutationstests sind Signifikanztests, die auf Permutations-Resamples basieren, die zufällig aus den Originaldaten gezogen wurden. Permutations-Resamples werden ersatzlos gezeichnet, im Gegensatz zu Bootstrap-Samples, die ersatzlos gezeichnet werden. Hier ist ein Beispiel, das ich in R eines einfachen Permutationstests gemacht habe. (Ihre Kommentare sind willkommen)

Permutationstests haben große Vorteile. Sie erfordern keine spezifischen Bevölkerungsformen wie Normalität. Sie gelten für eine Vielzahl von Statistiken, nicht nur für Statistiken, die unter der Nullhypothese eine einfache Verteilung aufweisen. Sie können sehr genaue p-Werte liefern, unabhängig von der Form und Größe der Population (wenn genügend Permutationen verwendet werden).

Ich habe auch gelesen, dass es oft nützlich ist, ein Konfidenzintervall zusammen mit einem Test anzugeben, der mithilfe von Bootstrap-Resampling anstelle von Permutations-Resampling erstellt wird.

Können Sie erklären (oder nur den R-Code angeben), wie ein Konfidenzintervall aufgebaut ist (dh für die Differenz zwischen den Mitteln der beiden Stichproben im obigen Beispiel)?

BEARBEITEN

Nach einigem googeln fand ich diese interessante Lektüre .

Antworten:


7

Es ist in Ordnung, Permutation Resampling zu verwenden. Es hängt wirklich von einer Reihe von Faktoren ab. Wenn Ihre Permutationen relativ niedrig sind, ist Ihre Schätzung Ihres Konfidenzintervalls bei Permutationen nicht so gut. Ihre Permutationen befinden sich in einer Grauzone und sind wahrscheinlich in Ordnung.

Der einzige Unterschied zu Ihrem vorherigen Code besteht darin, dass Sie Ihre Stichproben zufällig anstatt mit Permutationen generieren. Und Sie würden mehr davon generieren, sagen wir zum Beispiel 1000. Erhalten Sie die Differenzwerte für Ihre 1000 Wiederholungen Ihres Experiments. Nehmen Sie die Grenzwerte für die mittlere 950 (95%). Das ist dein Konfidenzintervall. Es fällt direkt vom Bootstrap.

Das meiste haben Sie in Ihrem Beispiel bereits getan. dif.treat ist 462 Artikel lang. Daher benötigen Sie die unteren 2,5% - und oberen 2,5% -Schnitte (ca. 11 Elemente an jedem Ende).

Verwenden Sie Ihren Code von vor ...

y <- sort(dif.treat)
ci.lo <- y[11]
ci.hi <- y[462-11]

Auf Anhieb würde ich sagen, dass 462 ein wenig niedrig ist, aber Sie werden feststellen, dass ein Bootstrap von 10.000 mit Punkten herauskommt, die sich kaum unterscheiden (wahrscheinlich näher am Mittelwert).

Ich dachte, ich würde auch einen einfachen Code hinzufügen, der die Boot-Bibliothek erfordert (basierend auf Ihrem vorherigen Code).

diff <- function(x,i) mean(x[i[6:11]]) - mean(x[i[1:5]])
b <- boot(total, diff, R = 1000)
boot.ci(b)

Vielen Dank. Ist es in Ordnung, die Samples mit sampleund zu generieren replace=TRUE? Gibt es einen Grund, ein Paket wie zu verwenden boot?
George Dontas

Normalerweise erfolgt dies durch Ersetzen, sodass Sie dies auf TRUE setzen möchten. Warum ... das Paket ist so optimiert, dass es schneller laufen sollte ... nie zeitlich festgelegt. Dies kann ein Problem sein, wenn Sie R groß einstellen. Und wie Sie sehen können, ist der Code schön und prägnant. Es hat auch viele Funktionen, die Sie nicht einfach selbst rollen könnten.
John

boot.ci gibt das Konfidenzintervall zurück. Gibt es eine (Boot-) Funktion, die den p.value angibt? (als das Verhältnis der Anzahl der Unterschiede, die mindestens so hoch ist wie die beobachtete, zur Gesamtzahl der generierten Proben)
George Dontas

ok, ich habe einen Weg gefunden, es zu bekommen:sum(b$t>=b$t0)/b$R
George Dontas

@ gd047: Berücksichtigen Sie, dass dies ein einseitiger p-Wert ist, den Sie berechnen.
Joris Meys

4

Da ein Permutationstest ein exakter Test ist, erhalten Sie einen exakten p-Wert. Das Bootstrapping eines Permutationstests ist nicht sinnvoll.

Darüber hinaus ist es auch nicht sinnvoll, ein Konfidenzintervall um eine Teststatistik herum zu bestimmen, da es auf der Grundlage Ihrer Stichprobe und nicht auf der Grundlage einer Schätzung berechnet wird. Sie bestimmen Konfidenzintervalle um Schätzungen wie Mittelwerte und dergleichen, jedoch nicht um Teststatistiken.

Permutationstests sollten nicht für Datensätze verwendet werden, die so groß sind, dass Sie nicht mehr alle möglichen Permutationen berechnen können. Wenn dies der Fall ist, verwenden Sie ein Bootstrap-Verfahren, um den Grenzwert für die von Ihnen verwendete Teststatistik zu bestimmen. Dies hat jedoch wiederum wenig mit einem 95% -Konfidenzintervall zu tun.

Ein Beispiel: Ich verwende hier die klassische T-Statistik, verwende jedoch einen einfachen Ansatz für das Bootstrapping zur Berechnung der empirischen Verteilung meiner Statistik. Darauf basierend berechne ich einen empirischen p-Wert:

x <- c(11.4,25.3,29.9,16.5,21.1)
y <- c(23.7,26.6,28.5,14.2,17.9,24.3)

t.sample <- t.test(x,y)$statistic
t.dist <- apply(
      replicate(1000,sample(c(x,y),11,replace=F)),2,
      function(i){t.test(i[1:5],i[6:11])$statistic})

# two sided testing
center <- mean(t.dist)
t.sample <-abs(t.sample-center)
t.dist <- abs(t.dist - center)
p.value <- sum( t.sample < t.dist ) / length(t.dist)
p.value

Beachten Sie, dass dieser zweiseitige Test nur für symmetrische Verteilungen funktioniert. Nicht symmetrische Verteilungen werden normalerweise nur einseitig getestet.

EDIT:

OK, ich habe die Frage falsch verstanden. Wenn Sie ein Konfidenzintervall für die Schätzung der Differenz berechnen möchten, können Sie den hier genannten Code für das Bootstrapping in jedem Beispiel verwenden. Wohlgemerkt, dies ist eine voreingenommene Schätzung: Im Allgemeinen ergibt dies ein zu kleines CI. Sehen Sie sich auch das dort angegebene Beispiel als Grund an, warum Sie für das Konfidenzintervall und den p-Wert einen anderen Ansatz verwenden müssen.


1
Können Sie erklären, warum Permutationstests nicht für Datensätze verwendet werden sollten, bei denen Sie nicht alle möglichen Permutationen berechnen können?
Andy W

@Andy W: Definieren Sie zuerst "Permutationstest". Permutationstests sind für mich exakte Tests, bei denen jede mögliche Permutation verwendet wird. Dies ist bei größeren Datensätzen nicht möglich. Die "ungefähren Permutationstests" sind in der Tat die einfache Monte-Carlo-Methode und sollten auf diese Weise behandelt werden. Darüber hinaus stellt der zentrale Grenzwertsatz in den meisten Fällen sicher, dass die Annahmen bezüglich der Verteilung der Teststatistik bei Verwendung großer Datensätze erfüllt sind. Bei komplexen Tests macht die Verwendung von Permutationstests für große Datenmengen die Berechnungszeiten unerträglich lang, ohne dass ein signifikanter Wert hinzugefügt wird. my2cents
Joris Meys

Ich habe nichts anderes gesagt, als einen Permutationstest zu booten. Ich bin auf diese Frage gekommen, nachdem ich den letzten Absatz von [ABSCHNITT 14.5 | gelesen hatte Zusammenfassung], im verlinkten PDF.
George Dontas

@ gd047 Dann habe ich deine Frage falsch verstanden. Aber Sie sollten Konfidenzintervalle und p.-Werte wirklich streng getrennt halten. Das Konfidenzintervall wird basierend auf dem Bootstrapping innerhalb jeder Stichprobe geschätzt (obwohl es per Definition verzerrt ist). Der Permutationstest wird durch Permutationen über den gesamten Datensatz durchgeführt. Das sind zwei völlig verschiedene Dinge.
Joris Meys

@ Kevin: Code war verdammt richtig. Lesen Sie den Code noch einmal: Das x[6:11]bezieht sich auf das Argument xder anonymen Funktion innerhalb der Apply. Vielleicht verwirrend, aber Ihre Bearbeitung ergab sehr falsche Ergebnisse. Bitte kommentieren Sie, was Ihrer Meinung nach sein sollte, bevor Sie den Code bearbeiten. Spart mir einen Rollback. Um weitere Verwirrung zu vermeiden, habe ich das xini
Joris Meys

0

Aus Joris Meys Code in den Antworten, jedoch mit Änderungen, damit er in mehr als einer Situation angewendet werden kann:

Ich habe versucht, den anderen zu bearbeiten, aber ich hatte keine Zeit zum Beenden und aus irgendeinem Grund kann ich keinen Kommentar abgeben (vielleicht weil dies eine alte Frage ist).

x <- c(11.4,25.3,29.9,16.5,21.1)
y <- c(23.7,26.6,28.5,14.2,17.9,24.3)

t.sample <- t.test(x,y)$statistic

t.dist <- apply(
          replicate(1000,sample(c(x,y),length(c(x,y)),replace=F)), 2,
          function(i){t.test(i[1:length(x)],i[length(x)+1:length(c(x,y))])$statistic})

# two sided testing
center <- mean(t.dist)
t.sample <-abs(t.sample-center)
t.dist <- abs(t.dist - center)
p.value <- sum( t.sample < t.dist ) / length(t.dist)
p.value
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.