Métodos de remuestreo / simulación: monte carlo, bootstrapping, jackknifing, validación cruzada, pruebas de aleatorización y pruebas de permutación

75

Estoy tratando de entender la diferencia entre los diferentes métodos de remuestreo (simulación Monte Carlo, bootstrapping paramétrico, bootstrapping no paramétrico, jackknifing, validación cruzada, pruebas de aleatorización y pruebas de permutación) y su implementación en mi propio contexto usando R.

Digamos que tengo la siguiente situación: quiero realizar ANOVA con una variable Y ( Yvar) y una variable X ( Xvar). Xvares categórico Estoy interesado en las siguientes cosas:

(1) Importancia de los valores p - tasa de descubrimiento falso

(2) tamaño del efecto de los Xvarniveles

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)

¿Podría explicarme las diferencias de muestreo con ejemplos explícitos trabajados sobre cómo funcionan estos métodos de remuestreo?

Ediciones: Aquí están mis intentos:

Bootstrap 10 muestras de bootstrap, número de muestra con reemplazo, significa que las muestras pueden repetirse

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]

Permutación: 10 muestras de permutación, número de muestras sin reemplazo

 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]

Simulación Monte Caro

Aunque el término "remuestreo" a menudo se usa para referirse a cualquier simulación de muestreo aleatorio o pseudoaleatorio repetido, cuando el "remuestreo" se realiza a partir de una distribución teórica conocida, el término correcto es la simulación "Monte Carlo".

No estoy seguro de todos los términos anteriores y si mis ediciones anteriores son correctas. Encontré información sobre Jacknife pero no pude domesticarla a mi situación.

Ram Sharma
fuente
3
Jackknife es un predecesor más simple del bootstrap. en.wikipedia.org/wiki/Jackknife_(statistics)
EngrStudent
44
Más precisamente: jackknife es un remuestreo de dejar uno afuera [pero no se usa para validación cruzada]
cbeleites

Respuestas:

123

Podemos encontrar diferentes métodos de remuestreo , o llamados métodos de " simulación ", que dependen del remuestreo o barajamiento de las muestras. Puede haber diferencias de opinión con respecto a la terminología adecuada, pero la siguiente discusión intenta generalizar y simplificar lo que está disponible en la literatura apropiada:

Los métodos de remuestreo se utilizan para (1) estimar la precisión / exactitud de las estadísticas de la muestra mediante el uso de un subconjunto de datos (por ejemplo, Jackknifing) o dibujar al azar con el reemplazo de un conjunto de puntos de datos (por ejemplo, bootstrapping) (2) Intercambiar etiquetas en los puntos de datos cuando se realiza la significancia pruebas ( pruebas de permutación, también llamadas pruebas exactas, pruebas de aleatorización o pruebas de aleatorización) (3) Validación de modelos mediante subconjuntos aleatorios (bootstrapping, validación cruzada) (ver wikipedia: métodos de remuestreo )

ARRANQUE

" Bootstrapping es un método estadístico para estimar la distribución de muestreo de un estimador mediante muestreo con reemplazo de la muestra original". El método asigna medidas de precisión (definidas en términos de sesgo , varianza , intervalos de confianza , error de predicción o alguna otra medida) a las estimaciones de muestra.

La idea básica de bootstrapping es que la inferencia sobre una población a partir de datos de muestra ( muestra → población ) se puede modelar volviendo a muestrear los datos de la muestra y realizando inferencia en (remuestreo → muestra). Como la población es desconocida, el verdadero error en una estadística de muestra contra su valor de población es incognoscible. En los ejemplos de bootstrap, la "población" es de hecho la muestra, y esto se conoce; por lo tanto, la calidad de la inferencia de la muestra de datos → muestra 'verdadera' es medible ". ver 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)

En problemas univariantes, generalmente es aceptable volver a muestrear las observaciones individuales con reemplazo ("remuestreo de casos"). Aquí volvemos a muestrear los datos con reemplazo, y el tamaño de la muestra debe ser igual al tamaño del conjunto de datos original.

En problemas de regresión, el remuestreo de casos se refiere al esquema simple de remuestreo de casos individuales: a menudo filas de un conjunto de datos en problemas de regresión, las variables explicativas a menudo son fijas, o al menos se observan con más control que la variable de respuesta. Además, el rango de las variables explicativas define la información disponible de ellas. Por lo tanto, volver a muestrear casos significa que cada muestra de bootstrap perderá algo de información (ver Wikipedia ). Por lo tanto, será lógico muestrear filas de datos en lugar de solo 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]

Puede ver que algunos casos se repiten a medida que tomamos muestras con reemplazo.

" Bootstrap paramétrico: se ajusta un modelo paramétrico a los datos, a menudo con la máxima probabilidad, y se extraen muestras de números aleatorios de este modelo ajustado . Por lo general, la muestra extraída tiene el mismo tamaño de muestra que los datos originales. Luego, la cantidad o la estimación , de interés se calcula a partir de estos datos. Este proceso de muestreo se repite muchas veces como para otros métodos de arranque. El uso de un modelo paramétrico en la etapa de muestreo de la metodología de arranque lleva a procedimientos que son diferentes de los obtenidos al aplicar la teoría estadística básica para deducir el mismo modelo "(ver Wikipedia ). Lo siguiente es bootstrap paramétrico con suposición de distribución normal con parámetros de media y desviación estándar.

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)

Existen otras variantes de bootstrap, consulte la página de wikipedia o cualquier buen libro de estadísticas sobre remuestreo.

JACKNIFE

"El estimador de jackknife de un parámetro se encuentra omitiendo sistemáticamente cada observación de un conjunto de datos y calculando la estimación y luego encontrando el promedio de estos cálculos. Dada una muestra de tamaño N, la estimación de jackknife se encuentra agregando las estimaciones de cada N − 1estimación en la muestra ". ver: wikipedia A continuación se muestra cómo usar la navaja 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

"El bootstrap regular y la navaja de bolsillo, estiman la variabilidad de una estadística a partir de la variabilidad de esa estadística entre submuestras, en lugar de suposiciones paramétricas . aproximación de la misma. Ambas producen resultados numéricos similares, por lo que cada una puede verse como una aproximación a la otra ". Ver esta pregunta en Bootstrap vs Jacknife.

PRUEBAS DE ALEATORIZACIÓN

"En las pruebas paramétricas, tomamos muestras al azar de una o más poblaciones. Hacemos ciertos supuestos sobre esas poblaciones, más comúnmente que normalmente se distribuyen con variaciones iguales. Establecemos una hipótesis nula que se enmarca en términos de parámetros, a menudo de la forma m1 -m2 = 0. Usamos nuestras estadísticas de muestra como estimaciones de los parámetros de población correspondientes, y calculamos un estadístico de prueba (como en la prueba) .Por ejemplo: en la prueba t de Student - para las diferencias de medias cuando las variaciones son desconocidas, pero se consideran ser igual. La hipótesis de interés es que H0: m1 = m2. Una de las hipótesis alternativas se plantearía como:HA: m1 < m2. Dadas dos muestras extraídas de las poblaciones 1 y 2, suponiendo que estas son poblaciones normalmente distribuidas con variaciones iguales, y que las muestras se extrajeron de forma independiente y al azar de cada población, entonces se puede elaborar una estadística cuya distribución se conozca para probar H0.

Una forma de evitar estos supuestos de distribución ha sido el enfoque que ahora se llama estadísticas no paramétricas, de orden de rango, de rango y sin distribución. Estas estadísticas libres de distribución generalmente son criticadas por ser menos "eficientes" que la prueba análoga basada en suponer que las poblaciones están distribuidas normalmente.

Otro enfoque alternativo es el enfoque de aleatorización : "proceso de asignación aleatoria de rangos a observaciones independientemente del conocimiento que se tenga de la muestra a la que pertenece una observación. Una prueba de aleatorización utiliza dicho procedimiento, pero lo hace operando las observaciones en lugar de la articulación clasificación de las observaciones. Por esta razón, la distribución de una estadística análoga (la suma de las observaciones en una muestra) no se puede tabular fácilmente, aunque es teóricamente posible enumerar dicha distribución "( ver )

Las pruebas de aleatorización difieren de las pruebas paramétricas en casi todos los aspectos. (1) No hay requisito de que tengamos muestras aleatorias de una o más poblaciones; de hecho, generalmente no hemos tomado muestras al azar. (2) Raramente pensamos en términos de las poblaciones de las que provienen los datos, y no hay necesidad de asumir nada sobre la normalidad o la homocedasticidad (3) Nuestra hipótesis nula no tiene nada que ver con los parámetros, sino que está redactada de manera bastante vaga, ya que, por ejemplo, la hipótesis de que el tratamiento no tiene ningún efecto sobre el rendimiento de los participantes. (4) Debido a que no estamos interesados ​​en las poblaciones, no estamos interesados ​​en estimar (o incluso probar) las características de esas poblaciones (5) Calculamos algunos tipo de estadística de prueba, sin embargo, no comparamos esa estadística con las distribuciones en tablas. En lugar, lo comparamos con los resultados que obtenemos cuando aleatorizamos repetidamente los datos entre los grupos y calculamos la estadística correspondiente para cada aleatorización. (6) Incluso más que las pruebas paramétricas, las pruebas de aleatorización enfatizan la importancia de la asignación aleatoria de los participantes a los tratamientos ".ver .

El tipo de prueba de aleatorización que es muy popular es la prueba de permutación. Si nuestro tamaño de muestra es 12 y 5, la permutación total posible es C(12,5) = 792. Si nuestros tamaños de muestra fueran 10 y 15, más de 3.2 millones de arreglos habrían sido posibles. Este es un desafío informático: ¿qué entonces? Muestra . Cuando el universo de posibles arreglos es demasiado grande para enumerar, ¿por qué no muestrear arreglos de este universo de forma independiente y aleatoria? La distribución del estadístico de prueba en esta serie de muestras se puede tabular, calcular su media y varianza, y estimar la tasa de error asociada con una prueba de hipótesis.

PRUEBA DE PERMUTACION

Según wikipedia, "una prueba de permutación (también llamada prueba de aleatorización , prueba de aleatorización o prueba exacta ) es un tipo de prueba de significación estadística en la que la distribución del estadístico de prueba bajo la hipótesis nula se obtiene calculando todos los valores posibles del estadístico de prueba bajo la reordenación de las etiquetas en los puntos de datos observados. Existen pruebas de permutación para cualquier estadístico de prueba, independientemente de si se conoce o no su distribución. Por lo tanto, uno siempre es libre de elegir el estadístico que mejor discrimina entre hipótesis y alternativas. lo que minimiza las pérdidas ".

La diferencia entre permutación y bootstrap es que la muestra de bootstraps con reemplazo y la muestra de permutaciones sin reemplazo . En cualquier caso, el orden de tiempo de las observaciones se pierde y, por lo tanto, se pierde la agrupación de volatilidad , lo que garantiza que las muestras estén bajo la hipótesis nula de que no hay agrupación de volatilidad.

Las permutaciones siempre tienen las mismas observaciones, por lo que se parecen más a los datos originales que a las muestras de bootstrap. La expectativa es que la prueba de permutación debería ser más sensible que una prueba de arranque. Las permutaciones destruyen la agrupación de volatilidad pero no agregan ninguna otra variabilidad .

Consulte la pregunta sobre permutación frente a bootstrapping: "La prueba de permutación es mejor para probar hipótesis y el bootstrapping es mejor para estimar intervalos de confianza ".

Entonces, para realizar la permutación en este caso, solo podemos cambiar replace = FALSEen el ejemplo de arranque anterior.

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)

En el caso de más de una variable, solo elegir las filas y reorganizar el orden no hará ninguna diferencia, ya que los datos seguirán siendo los mismos. Entonces reorganizamos la variable y. Algo que has hecho, pero no creo que necesitemos una doble reorganización de ambos xy y variables(como lo has hecho).

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]

MÉTODOS DE MONTE CARLO

"Los métodos de Monte Carlo (o experimentos de Monte Carlo) son una amplia clase de algoritmos computacionales que se basan en muestreo aleatorio repetido para obtener resultados numéricos; por lo general, se ejecutan simulaciones muchas veces para obtener la distribución de una entidad probabilística desconocida. El nombre viene desde la semejanza de la técnica hasta el acto de jugar y registrar resultados en un casino de juego real ". ver Wikipedia

"En las estadísticas aplicadas, los métodos de Monte Carlo se usan generalmente para dos propósitos:

(1) Comparar estadísticas competitivas para muestras pequeñas en condiciones de datos realistas. Aunque el error tipo I y las propiedades de potencia de las estadísticas se pueden calcular para datos extraídos de distribuciones teóricas clásicas (p. Ej., Curva normal, distribución de Cauchy) para condiciones asintóticas (es decir, tamaño de muestra infinito y efecto de tratamiento infinitesimalmente pequeño), los datos reales a menudo lo hacen No tener tales distribuciones.

(2) Proporcionar implementaciones de pruebas de hipótesis que sean más eficientes que las pruebas exactas, como las pruebas de permutación (que a menudo son imposibles de calcular), mientras que son más precisas que los valores críticos para las distribuciones asintóticas.

Los métodos de Monte Carlo también son un compromiso entre la aleatorización aproximada y las pruebas de permutación . Una prueba de aleatorización aproximada se basa en un subconjunto específico de todas las permutaciones (lo que implica una limpieza potencialmente enorme de las cuales se han considerado las permutaciones). El enfoque de Monte Carlo se basa en un número específico de permutaciones extraídas al azar ( intercambiando una pérdida menor de precisión si se extrae una permutación dos veces, o con mayor frecuencia, por la eficacia de no tener que rastrear qué permutaciones ya se han seleccionado ) ".

Tanto la prueba de MC como la de permutación se denominan a veces colectivamente pruebas de aleatorización . La diferencia está en MC nos muestra las muestras de permutación, en lugar usando todas las combinaciones posibles ver .

VALIDACIÓN CRUZADA

La idea más allá de la validación cruzada es que los modelos deben probarse con datos que no se utilizaron para ajustarse al modelo. La validación cruzada se usa con mayor frecuencia en el contexto de la predicción .

"La validación cruzada es un método estadístico para validar un modelo predictivo. Los subconjuntos de datos se guardan para su uso como conjuntos de validación ; un modelo se ajusta a los datos restantes (un conjunto de entrenamiento) y se utiliza para predecir el conjunto de validación. La calidad de las predicciones en los conjuntos de validación proporciona una medida general de la precisión de las predicciones.

Una forma de validación cruzada deja de lado una sola observación a la vez; Esto es similar a la navaja. Otra, la validación cruzada K-fold, divide los datos en K subconjuntos; cada uno se presenta a su vez como el conjunto de validación ". ver Wikipedia . La validación cruzada generalmente se realiza con datos cuantitativos. Puede convertir su cualitativo (datos factoriales) a cuantitativo de alguna manera para ajustar un modelo lineal y probar este modelo. Lo siguiente es simple estrategia de retención donde el 50% de los datos se usa para la predicción del modelo mientras que el resto se usa para las pruebas. Supongamos Xvarque también es variable cuantitativa.

    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]

A diferencia de las pruebas de arranque y permutación, el conjunto de datos de validación cruzada para el entrenamiento y las pruebas es diferente. La siguiente figura muestra un resumen de remuestreo en diferentes métodos.

ingrese la descripción de la imagen aquí

Espero que esto ayude un poco.

rdorlearn
fuente
23
Esto es impresionante, y especialmente, ¡ya que es su primera respuesta! Espero que continúes participando aquí y espero tus futuras contribuciones a nuestro sitio.
whuber
Esta respuesta es una gran respuesta de panorama general. Sin embargo, algunos de los enlaces parecen estar abandonados. ¿Alguien tiene idea de dónde están los enlaces?
tintinthong
8

Aquí está mi contribución.

Datos

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

Veo a Monte Carlo como un método para obtener una distribución de una variable aleatoria (resultado), que es el resultado de una función no trivial de otras variables aleatorias (de entrada). No veo una superposición inmediata con el análisis ANOVA actual, probablemente otros miembros del foro pueden dar su opinión aquí.

Bootstrapping

El propósito es tener una idea de la incertidumbre de una estadística calculada a partir de una muestra observada. Por ejemplo: podemos calcular que la media muestral de Yvar es 8.4, pero ¿qué tan seguros estamos de la media poblacional de Yvar? El truco es hacer como si la muestra fuera la población, y muestrear muchas veces de esa población falsa.

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)

Simplemente tomamos muestras y no asumimos ninguna distribución paramétrica. Este es el bootstrap no paramétrico . Si se siente cómodo suponiendo, por ejemplo, que Xvar se distribuye normalmente, también puede tomar muestras de una distribución normal ( rnorm(...)) utilizando la media estimada y la desviación estándar, esta sería la rutina de arranque paramétrica .

¿Quizás otros usuarios podrían dar aplicaciones de bootstrap con respecto a los tamaños de efecto de los Xvarniveles?

Plegamiento

La navaja parece estar un poco anticuada. Solo para completar, puede compararlo más o menos con el bootstrap, pero la estrategia está aquí para ver qué sucede si dejamos de lado una observación (y repitamos esto para cada observación).

Validación cruzada

En la validación cruzada, divide su conjunto de datos (generalmente grande) en un conjunto de entrenamiento y un conjunto de validación, para ver qué tan bien su modelo estimado puede predecir los valores en el conjunto de validación. Personalmente, aún no he visto una aplicación de validación cruzada para ANOVA, por lo que prefiero dejar esta parte a otros.

Aleatorización / pruebas de permutación

Tenga cuidado, la terminología no está de acuerdo. Vea la diferencia entre la prueba de aleatorización y la prueba de permutación .

La hipótesis nula sería que no hay diferencia entre las poblaciones de los grupos A, B y C, por lo que no debería importar si intercambiamos al azar las etiquetas de los 15 valores de Xvar. Si el valor F observado originalmente (u otra estadística) no está de acuerdo con los obtenidos después de intercambiar etiquetas al azar, entonces probablemente importó, y la hipótesis nula puede ser rechazada.

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="")

histograma

Sin embargo, tenga cuidado con la forma en que reasigna las etiquetas en el caso de diseños complejos. También tenga en cuenta que, en el caso de variaciones desiguales, la hipótesis nula de intercambiabilidad no es cierta en primer lugar, por lo que esta prueba de permutación no sería correcta.

Aquí no revisamos explícitamente todas las permutaciones posibles de las etiquetas, esta es una estimación de Monte Carlo del valor P. Con pequeños conjuntos de datos puede pasar por todas las permutaciones posibles, pero el código R anterior es un poco más fácil de entender.

lgbi
fuente