Méthodes de rééchantillonnage / simulation: monte carlo, bootstrapping, jackknifing, validation croisée, tests de randomisation et tests de permutation

75

J'essaie de comprendre la différence entre différentes méthodes de rééchantillonnage (simulation de Monte Carlo, amorçage paramétrique, amorçage non paramétrique, jackknifing, validation croisée, tests de randomisation et de permutation) et leur mise en œuvre dans mon propre contexte en utilisant R.

Disons que j'ai la situation suivante - je veux effectuer une ANOVA avec une variable Y ( Yvar) et une variable X ( Xvar). Xvarest catégorique. Je suis intéressé par les choses suivantes:

(1) Importance des valeurs p - taux de fausse découverte

(2) taille de l'effet des Xvarniveaux

Yvar <- c(8,9,10,13,12, 14,18,12,8,9,   1,3,2,3,4)
Xvar <- c(rep("A", 5),  rep("B", 5),    rep("C", 5))
mydf <- data.frame (Yvar, Xvar)

Pourriez-vous me expliquer les différences d’échantillonnage avec des exemples explicites et expliqués, comment fonctionne cette méthode de ré-échantillonnage?

Edits: Voici mes tentatives:

Bootstrap 10 échantillons bootstrap, nombre d'échantillons avec remplacement, signifie que les échantillons peuvent être répétés

boot.samples <- list()
for(i in 1:10) {
   t.xvar <- Xvar[ sample(length(Xvar), length(Xvar), replace=TRUE) ]
   t.yvar <- Yvar[ sample(length(Yvar), length(Yvar), replace=TRUE) ]
   b.df <- data.frame (t.xvar, t.yvar) 
   boot.samples[[i]] <- b.df 
}
str(boot.samples)
 boot.samples[1]

Permutation: 10 échantillons de permutation, nombre d'échantillons sans remplacement

 permt.samples <- list()
    for(i in 1:10) {
       t.xvar <- Xvar[ sample(length(Xvar), length(Xvar), replace=FALSE) ]
       t.yvar <- Yvar[ sample(length(Yvar), length(Yvar), replace=FALSE) ]
       b.df <- data.frame (t.xvar, t.yvar) 
       permt.samples[[i]] <- b.df 
    }
    str(permt.samples)
    permt.samples[1]

Simulation Monte Caro

Bien que le terme "rééchantillonnage" soit souvent utilisé pour désigner toute simulation répétée d'échantillonnage aléatoire ou pseudo-aléatoire, lorsque le "rééchantillonnage" est effectué à partir d'une distribution théorique connue, le terme correct est "simulation de Monte Carlo".

Je ne suis pas sûr de tous les termes ci-dessus et si mes modifications ci-dessus sont correctes. J'ai trouvé des informations sur jacknife mais je ne pouvais pas l'apprivoiser à ma situation.

Ram Sharma
la source
3
Jackknife est un prédécesseur plus simple du bootstrap. en.wikipedia.org/wiki/Jackknife_(statistics)
EngrStudent
4
Plus précisément: jackknife est un rééchantillonnage «non
mémorisé»

Réponses:

123

Nous pouvons trouver différentes méthodes de rééchantillonnage , ou plus généralement appelées méthodes de " simulation ", qui dépendent du rééchantillonnage ou du brassage des échantillons. Il peut y avoir des divergences d'opinions quant à la terminologie appropriée, mais la discussion suivante tente de généraliser et de simplifier ce qui est disponible dans la littérature appropriée:

Les méthodes de rééchantillonnage sont utilisées pour (1) estimer la précision / exactitude de statistiques d'échantillon en utilisant un sous-ensemble de données (par exemple, Jackknifing) ou en tirant au hasard avec remplacement à partir d'un ensemble de points de données (par exemple, bootstrapping) (2) Échange d'étiquettes sur des points de données pour la signification tests ( tests de permutation, également appelés tests exacts, tests de randomisation ou tests de re-randomisation) (3) Validation de modèles à l'aide de sous-ensembles aléatoires (amorçage, validation croisée) (voir wikipedia: méthodes de rééchantillonnage )

BOOTSTRAPING

"Le bootstrap est une méthode statistique permettant d'estimer la distribution d'échantillonnage d'un estimateur par échantillonnage avec remplacement à partir de l'échantillon d'origine". La méthode attribue des mesures d'exactitude (définies en termes de biais , de variance , d' intervalles de confiance , d' erreur de prédiction ou d'une autre mesure de ce type) à des estimations d'échantillonnage.

L'idée de base de l'amorçage est que l'inférence sur une population à partir de données d'échantillon ( échantillon → population ) peut être modélisée en rééchantillonnant les données de l'échantillon et en effectuant l'inférence sur (rééchantillonnage → échantillon). Comme la population est inconnue, l'erreur vraie dans un échantillon statistique par rapport à sa valeur de population est inconnaissable. Dans les rééchantillons bootstrap, la «population» est en fait l'échantillon, et ceci est connu; par conséquent, la qualité de l'inférence à partir des données de rééchantillonnage → "vrai" échantillon est mesurable. "voir wikipedia

Yvar <- c(8,9,10,13,12, 14,18,12,8,9,   1,3,2,3,4)

#To generate a single bootstrap sample
sample(Yvar, replace = TRUE) 

 #generate 1000 bootstrap samples
boot <-list()
for (i in 1:1000) 
   boot[[i]] <- sample(Yvar,replace=TRUE)

Dans les problèmes univariés, il est généralement acceptable de rééchantillonner les observations individuelles avec remplacement ("rééchantillonnage de cas"). Ici, nous rééchantillons les données avec remplacement, et la taille du rééchantillonnage doit être égale à la taille de l'ensemble de données d'origine.

Dans les problèmes de régression, le rééchantillonnage de cas fait référence au schéma simple consistant à rééchantillonner des cas individuels - souvent des lignes d'un ensemble de données dans des problèmes de régression, les variables explicatives sont souvent fixes, ou au moins observées avec plus de contrôle que la variable de réponse. En outre, la plage des variables explicatives définit les informations disponibles à partir de celles-ci. Par conséquent, rééchantillonner les cas signifie que chaque échantillon bootstrap perdra certaines informations (voir Wikipedia ). Il sera donc logique d'échantillonner les lignes de données plutôt que simplement Yvar.

Yvar <- c(8,9,10,13,12, 14,18,12,8,9,   1,3,2,3,4)
Xvar <- c(rep("A", 5),  rep("B", 5),    rep("C", 5))
mydf <- data.frame (Yvar, Xvar)    

boot.samples <- list()
for(i in 1:10) {
   b.samples.cases <- sample(length(Xvar), length(Xvar), replace=TRUE) 
   b.mydf <- mydf[b.samples.cases,] 
   boot.samples[[i]] <- b.mydf
}
str(boot.samples)
 boot.samples[1]

Vous pouvez voir que certains cas sont répétés alors que nous échantillonnons avec remplacement.

" Bootstrap paramétrique - un modèle paramétrique est ajusté aux données, souvent par maximum de vraisemblance, et des échantillons de nombres aléatoires sont tirés de ce modèle ajusté . Généralement, l'échantillon prélevé a la même taille d'échantillon que les données d'origine. Ensuite, la quantité, ou l'estimation , l’intérêt est calculé à partir de ces données. Ce processus d’échantillonnage est répété plusieurs fois, comme pour d’autres méthodes bootstrap. L’utilisation d’un modèle paramétrique au stade de l’échantillonnage de la méthode bootstrap conduit à des procédures différentes de celles obtenues en appliquant la théorie statistique de base d'inférence pour le même modèle. "(voir Wikipedia ). Ce qui suit est un bootstrap paramétrique avec une hypothèse de distribution normale avec des paramètres de déviation moyenne et standard.

Yvar <- c(8,9,10,13,12, 14,18,12,8,9,   1,3,2,3,4)

# parameters for Yvar 
mean.y <- mean(Yvar)
sd.y <- sd(Yvar)

#To generate a single bootstrap sample with assumed normal distribution (mean, sd)
rnorm(length(Yvar), mean.y, sd.y)

 #generate 1000 bootstrap samples
boot <-list()
for (i in 1:1000) 
   boot[[i]] <- rnorm(length(Yvar), mean.y, sd.y)

Il existe d'autres variantes de bootstrap, veuillez consulter la page wikipedia ou tout bon livre de statistiques sur le ré-échantillonnage.

JACKNIFE

"L'estimateur jackknife d'un paramètre est obtenu en omettant systématiquement chaque observation dans un jeu de données et en calculant l'estimation, puis en calculant la moyenne de ces calculs. Pour un échantillon de taille N, l'estimation jackknife est obtenue en agrégeant les estimations de chaque N − 1estimation. dans l'échantillon. " voir: wikipedia Ce qui suit montre comment faire un jackknife Yvar.

jackdf <- list()
jack <- numeric(length(Yvar)-1)

for (i in 1:length (Yvar)){

for (j in 1:length(Yvar)){
     if(j < i){ 
            jack[j] <- Yvar[j]
}  else if(j > i) { 
             jack[j-1] <- Yvar[j]
}
}
jackdf[[i]] <- jack
}
jackdf

"le bootstrap normal et le jackknife, estiment la variabilité d'une statistique à partir de la variabilité de cette statistique entre sous-échantillons, plutôt que par des hypothèses paramétriques . Pour le jackknife plus général, les observations delete-m Les deux résultats donnent des résultats numériques similaires, ce qui explique pourquoi chacun peut être considéré comme une approximation de l’autre. " Voir cette question sur Bootstrap vs Jacknife.

TESTS DE RANDOMISATION

"Dans les tests paramétriques, nous échantillonnons de manière aléatoire une ou plusieurs populations. Nous émettons certaines hypothèses à propos de ces populations, le plus souvent qu’elles sont normalement réparties avec des variances égales. Nous établissons une hypothèse nulle définie en termes de paramètres, souvent de la forme m1 -m2 = 0. Nous utilisons nos statistiques d'échantillon comme estimations des paramètres de population correspondants et calculons une statistique de test (telle que at test), par exemple: dans Student's - teste les différences de moyennes lorsque les variances sont inconnues, mais sont prises en compte L’hypothèse d’intérêt est la suivante H0: m1 = m2: L’une des hypothèses alternatives serait la suivante:HA: m1 < m2. Étant donné que deux échantillons sont tirés des populations 1 et 2, en supposant qu'il s'agisse de populations normalement réparties présentant des variances égales et que les échantillons ont été prélevés indépendamment et au hasard dans chaque population, une statistique dont la distribution est connue peut être élaborée pour être testée H0.

L 'approche maintenant appelée statistiques non paramétriques, sans ordre de rang, sans rang et sans distribution est un moyen d' éviter ces hypothèses de répartition. Ces statistiques sans distribution sont généralement critiquées pour être moins "efficaces" que le test analogue basé sur l'hypothèse que les populations sont distribuées normalement.

Une approche alternative est l’approche de randomisation - "processus consistant à attribuer de façon aléatoire des notes à des observations indépendamment de la connaissance de l’échantillon dont une observation est un membre. Un test de randomisation utilise une telle procédure, mais utilise plutôt les observations plutôt que la classement des observations. Pour cette raison, la distribution d’une statistique analogue (la somme des observations dans un échantillon) ne peut pas être facilement tabulée, bien qu’il soit théoriquement possible d’énumérer une telle distribution "( voir )

Les tests de randomisation diffèrent des tests paramétriques à presque tous les égards. (1) Il n’est pas nécessaire de disposer d’échantillons aléatoires d’une ou de plusieurs populations. En fait, nous n’avons généralement pas échantillonné au hasard. (2) Nous pensons rarement aux populations d'où proviennent les données et il n'est pas nécessaire de supposer quoi que ce soit au sujet de la normalité ou de l'homoscédasticité (3) Notre hypothèse nulle n'a rien à voir avec des paramètres, mais est formulée de manière assez vague, car Par exemple, l’hypothèse selon laquelle le traitement n’a pas d’effet sur le comportement des participants (4). Parce que nous ne sommes pas concernés par les populations, nous ne sommes pas concernés par l’estimation (ni même par les tests) des caractéristiques de ces populations (5). sorte de statistique de test, mais nous ne comparons pas cette statistique aux distributions présentées. Au lieu, nous le comparons aux résultats obtenus lorsque nous randomisons les données à plusieurs reprises et calculons la statistique correspondante pour chaque randomisation. (6) Encore plus que les tests paramétriques, les tests de randomisation soulignent l’importance de l’affectation aléatoire des participants aux traitements. "voir .

Le type de test de randomisation très populaire est le test de permutation. Si la taille de notre échantillon est 12 et 5, la permutation totale possible est C(12,5) = 792. Si la taille de nos échantillons avait été de 10 et 15, plus de 3,2 millions d'arrangements auraient été possibles. C'est un défi informatique: Quoi alors? Exemple . Quand l'univers des arrangements possibles est trop grand pour être énuméré, pourquoi ne pas échantillonner les arrangements de cet univers indépendamment et au hasard? La distribution de la statistique de test sur cette série d'échantillons peut ensuite être tabulée, sa moyenne et sa variance calculées, et le taux d'erreur associé à un test d'hypothèse estimé.

TEST DE PERMUTATION

Selon wikipedia « Un test de permutation (également appelé un test de randomisation , test de rééchantillonnage , ou un test exact ) est un type de test de signification statistique dans laquelle la distribution de la statistique de test sous l'hypothèse nulle est obtenue en calculant toutes les valeurs possibles de la statistique de test sous réarrangements des étiquettes sur les points de données observées. tests permutation existent pour une statistique de test, peu importe si oui ou non la distribution est connue. Ainsi , on est toujours libre de choisir la statistique qui correspond le mieux discriminant entre les hypothèses et alternatives et qui minimise les pertes. "

La différence entre permutation et bootstrap est que bootstraps sample avec replacement et permutations sample sans remplacement . Dans les deux cas, l'ordre chronologique des observations est perdu et donc le regroupement de la volatilité est perdu - assurant ainsi que les échantillons sont sous l'hypothèse nulle du regroupement sans volatilité.

Les permutations ont toujours toutes les mêmes observations, elles ressemblent donc davantage aux données d'origine qu'aux échantillons bootstrap. On s’attend à ce que le test de permutation soit plus sensible qu’un test bootstrap. Les permutations détruisent le regroupement de la volatilité mais n’ajoutent aucune autre variabilité .

Voir la question sur la permutation et l'amorçage - "Le test de permutation est le meilleur pour tester les hypothèses et l'amorce est le meilleur pour estimer les intervalles de confiance ".

Donc, pour effectuer la permutation dans ce cas, nous pouvons simplement changer replace = FALSEdans l'exemple de bootstrap ci-dessus.

Yvar <- c(8,9,10,13,12, 14,18,12,8,9,   1,3,2,3,4)
     #generate 1000 bootstrap samples
       permutes <-list()
    for (i in 1:1000) 
       permutes[[i]] <- sample(Yvar,replace=FALSE)

Dans le cas de plusieurs variables, le simple choix des lignes et le remaniement de l'ordre ne feront aucune différence, car les données resteront les mêmes. Nous remettons donc la variable y en revue. Quelque chose que vous avez fait, mais je ne pense pas que nous n’ayons pas besoin d’une double redistribution des deux xet y variables(comme vous l’avez fait).

Yvar <- c(8,9,10,13,12, 14,18,12,8,9,   1,3,2,3,4)
Xvar <- c(rep("A", 5),  rep("B", 5),    rep("C", 5))
mydf <- data.frame (Yvar, Xvar)

 permt.samples <- list()
    for(i in 1:10) {
       t.yvar <- Yvar[ sample(length(Yvar), length(Yvar), replace=FALSE) ]
       b.df <- data.frame (Xvar, t.yvar) 
       permt.samples[[i]] <- b.df 
    }
    str(permt.samples)
    permt.samples[1]

METHODES DE MONTE CARLO

"Les méthodes de Monte Carlo (ou expériences de Monte Carlo) sont une vaste classe d'algorithmes de calcul qui reposent sur un échantillonnage aléatoire répété pour obtenir des résultats numériques. Généralement, on effectue des simulations plusieurs fois pour obtenir la distribution d'une entité probabiliste inconnue. de la ressemblance de la technique à l'acte de jouer et d'enregistrer les résultats dans un vrai casino de jeu. "voir Wikipedia

"Dans les statistiques appliquées, les méthodes de Monte Carlo sont généralement utilisées à deux fins:

(1) Comparer des statistiques concurrentes pour de petits échantillons dans des conditions de données réalistes. Bien que l’erreur de type I et les propriétés de puissance des statistiques puissent être calculées pour des données tirées de distributions théoriques classiques (par exemple, courbe normale, distribution de Cauchy) et pour des conditions asymptotiques (taille de l’échantillon infinie et effet de traitement infiniment petit), les données réelles pas de telles distributions.

(2) Fournir des implémentations de tests d'hypothèses plus efficaces que des tests exacts tels que les tests de permutation (souvent impossibles à calculer) tout en étant plus précises que les valeurs critiques pour les distributions asymptotiques.

Les méthodes de Monte Carlo sont également un compromis entre la randomisation approximative et les tests de permutation . Un test de randomisation approximatif est basé sur un sous-ensemble spécifié de toutes les permutations (ce qui implique une gestion potentiellement énorme dont les permutations ont été prises en compte). L’approche de Monte Carlo est basée sur un nombre spécifié de permutations dessinées au hasard ( échange d’une perte de précision mineure si une permutation est dessinée deux fois - ou plus fréquemment - pour que l’efficacité de ne pas avoir à repérer les permutations déjà sélectionnées ). "

MC et test de permutation sont parfois appelés collectivement tests de randomisation . La différence est dans MC nous échantillonnons les échantillons de permutation, en utilisant plutôt toutes les combinaisons possibles, voir .

VALIDATION CROISÉE

L'idée au-delà de la validation croisée est que les modèles doivent être testés avec des données qui ne sont pas utilisées pour correspondre au modèle. La validation croisée est peut-être le plus souvent utilisée dans le contexte de la prédiction .

"La validation croisée est une méthode statistique permettant de valider un modèle prédictif. Des sous-ensembles de données sont conservés pour être utilisés en tant qu'ensembles de validation ; un modèle est ajusté aux données restantes (un ensemble d'apprentissage) et utilisé pour prédire l'ensemble de validation. la qualité des prévisions sur les ensembles de validation fournit une mesure globale de la précision des prévisions.

Une forme de validation croisée omet une observation à la fois; c'est semblable au jackknife. Une autre validation, la validation croisée des plis en K , divise les données en K sous-ensembles; Voir Wikipédia . La validation croisée se fait généralement avec des données quantitatives. Vous pouvez convertir vos données qualitatives (données factorielles) en données quantitatives pour les adapter à un modèle linéaire et les tester. Ce qui suit est simple stratégie de rétention dans laquelle 50% des données sont utilisées pour la prédiction du modèle, tandis que le reste est utilisé à des fins de test Xvar.

    Yvar <- c(8,9,10,13,12, 14,18,12,8,9,   1,3,2,3,4)
    Xvar <- c(rep(1, 5),  rep(2, 5),    rep(3, 5))
    mydf <- data.frame (Yvar, Xvar)
    training.id <- sample(1:nrow(mydf), round(nrow(mydf)/2,0), replace = FALSE)
    test.id <- setdiff(1:nrow(mydf), training.id)
   # training dataset 
    mydf.train <- mydf[training.id]

    #testing dataset 
    mydf.test <- mydf[test.id]

Contrairement aux tests d'amorçage et de permutation, le jeu de données de validation croisée pour la formation et les tests est différent. La figure suivante montre un résumé du rééchantillonnage selon différentes méthodes.

entrez la description de l'image ici

J'espère que ça aide un peu.

réapprendre
la source
23
C’est impressionnant, et surtout dans la mesure où c’est votre première réponse! J'espère que vous continuerez à participer ici et j'attends avec impatience vos contributions futures à notre site.
whuber
Cette réponse est une telle grande une réponse grande image. Cependant, certains liens semblent être abandonnés. Quelqu'un at-il une idée de l'endroit où les liens sont?
Tintinthong
8

Voici ma contribution.

Les données

Yvar <- c(8,9,10,13,12,
          14,18,12,8,9,
          1,3,2,3,4)
Xvar <- rep(LETTERS[1:3], each=5)
mydf <- data.frame(Yvar, Xvar)

monte Carlo

Je considère Monte Carlo comme une méthode permettant d’obtenir la distribution d’une variable aléatoire (de résultat), qui résulte d’une fonction non triviale d’autres variables aléatoires (d’entrée). Je ne vois pas immédiatement un chevauchement avec l'analyse actuelle de l'ANOVA, probablement d'autres membres du forum peuvent donner leur avis ici.

Amorçage

Le but est d'avoir une idée de l'incertitude d'une statistique calculée à partir d'un échantillon observé. Par exemple: nous pouvons calculer que la moyenne d’ échantillon d’Yvar est de 8,4, mais quelle est notre certitude quant à la moyenne de la population d’Yvar? L'astuce consiste à faire comme si l'échantillon était la population et à échantillonner plusieurs fois à partir de cette fausse population.

n <- 1000
bootstrap_means <- numeric(length=n)
for(i in 1:n){
   bootstrap_sample <- sample(x=Yvar, size=length(Yvar), replace=TRUE)
   bootstrap_means[i] <- mean(bootstrap_sample)
}
hist(bootstrap_means)

Nous venons de prendre des échantillons sans supposer de distribution paramétrique. C'est le bootstrap non paramétrique . Si vous pensez par exemple que Xvar est normalement distribué, vous pouvez également échantillonner à partir d'une distribution normale ( rnorm(...)) en utilisant la moyenne et l'écart type estimés, il s'agit du bootstrap paramétrique .

D'autres utilisateurs pourraient peut-être donner des applications du bootstrap en ce qui concerne la taille de l'effet des Xvarniveaux?

Jackknifing

Le jackknife semble être un peu dépassé. Juste pour être complet, vous pouvez le comparer plus ou moins au bootstrap, mais la stratégie est là pour voir ce qui se passe si nous omettons une observation (et le répète pour chaque observation).

Validation croisée

Lors de la validation croisée, vous divisez votre jeu de données (généralement volumineux) en un jeu d'apprentissage et un jeu de validation, pour voir dans quelle mesure votre modèle estimé est capable de prédire les valeurs dans le jeu de validation. Personnellement, je n'ai pas encore vu d'application de validation croisée à ANOVA, alors je préfère laisser cette partie à d'autres.

Tests de randomisation / permutation

Soyez averti, la terminologie n'est pas convenue. Voir Différence entre test de randomisation et test de permutation .

L'hypothèse nulle serait qu'il n'y a pas de différence entre les populations des groupes A, B et C, il ne devrait donc pas avoir d'importance si nous échangeons de manière aléatoire les étiquettes des 15 valeurs de Xvar. Si la valeur F observée à l'origine (ou une autre statistique) ne concorde pas avec celles obtenues après échange aléatoire d'étiquettes, cela a probablement eu de l'importance et l'hypothèse nulle peut être rejetée.

observed_F_value <- anova(lm(Yvar ~ Xvar))$"F value"[1]

n <- 10000
permutation_F_values <- numeric(length=n)

for(i in 1:n){
   # note: the sample function without extra parameters defaults to a permutation
   temp_fit <- anova(lm(Yvar ~ sample(Xvar)))
   permutation_F_values[i] <- temp_fit$"F value"[1]
}

hist(permutation_F_values, xlim=range(c(observed_F_value, permutation_F_values)))
abline(v=observed_F_value, lwd=3, col="red")
cat("P value: ", sum(permutation_F_values >= observed_F_value), "/", n, "\n", sep="")

histogramme

Soyez prudent avec la façon dont vous réaffectez les étiquettes dans le cas de conceptions complexes. Notez également que dans le cas de variances inégales, l'hypothèse nulle d'échangeabilité n'est pas vraie en premier lieu, donc ce test de permutation ne serait pas correct.

Ici, nous n'avons pas explicitement passé en revue toutes les permutations possibles des étiquettes, il s'agit d'une estimation de Monte-Carlo de la valeur de p. Avec de petits ensembles de données, vous pouvez passer par toutes les permutations possibles, mais le code R ci-dessus est un peu plus facile à comprendre.

lgbi
la source