Estoy produciendo un script para crear muestras de bootstrap del cats
conjunto de datos (del -MASS-
paquete).
Siguiendo el libro de texto de Davidson y Hinkley [1], realicé una regresión lineal simple y adopté un procedimiento no paramétrico fundamental para el arranque de las observaciones de iid, a saber, el remuestreo de pares .
La muestra original tiene la forma:
Bwt Hwt
2.0 7.0
2.1 7.2
...
1.9 6.8
A través de un modelo lineal univariante, queremos explicar el peso del hogar de los gatos a través de su peso cerebral.
El codigo es:
library(MASS)
library(boot)
##################
# CATS MODEL #
##################
cats.lm <- glm(Hwt ~ Bwt, data=cats)
cats.diag <- glm.diag.plots(cats.lm, ret=T)
#######################
# CASE resampling #
#######################
cats.fit <- function(data) coef(glm(data$Hwt ~ data$Bwt))
statistic.coef <- function(data, i) cats.fit(data[i,])
bootl <- boot(data=cats, statistic=statistic.coef, R=999)
Supongamos ahora que existe una variable de agrupación cluster = 1, 2,..., 24
(por ejemplo, cada gato pertenece a una camada determinada). Para simplificar, suponga que los datos están equilibrados: tenemos 6 observaciones para cada grupo. Por lo tanto, cada una de las 24 camadas se compone de 6 gatos (es decir, n_cluster = 6
y n = 144
).
Es posible crear una cluster
variable falsa a través de:
q <- rep(1:24, times=6)
cluster <- sample(q)
c.data <- cbind(cats, cluster)
Tengo dos preguntas relacionadas:
¿Cómo simular muestras de acuerdo con la estructura del conjunto de datos (agrupados)? Es decir, ¿cómo volver a muestrear a nivel de clúster? Me gustaría muestrear los grupos con reemplazo y establecer las observaciones dentro de cada grupo seleccionado como en el conjunto de datos original (es decir, tomar muestras con el reemplazo de los grupos y sin reemplazar las observaciones dentro de cada grupo).
Esta es la estrategia propuesta por Davidson (p. 100). Supongamos que sacamos B = 100
muestras. Cada uno de ellos debe estar compuesto por 24 grupos posiblemente recurrentes (por ejemplo cluster = 3, 3, 1, 4, 12, 11, 12, 5, 6, 8, 17, 19, 10, 9, 7, 7, 16, 18, 24, 23, 11, 15, 20, 1
), y cada grupo debe contener las mismas 6 observaciones del conjunto de datos original. ¿Cómo hacer eso en R
? (ya sea con o sin el -boot-
paquete). ¿Tiene sugerencias alternativas para continuar?
La segunda pregunta se refiere al modelo de regresión inicial. Supongamos que adopto un modelo de efectos fijos , con intersecciones a nivel de clúster. ¿Cambia el procedimiento de remuestreo adoptado?
[1] Davidson, AC, Hinkley, DV (1997). Métodos Bootstrap y sus aplicaciones . Prensa de la Universidad de Cambridge.
fuente
Traté de resolver el problema yo mismo, y produje el siguiente código.
Aunque funciona, probablemente podría mejorarse en términos de velocidad. Además, si fuera posible, hubiera preferido encontrar una manera de usar el
-boot-
paquete, ya que permite calcular automáticamente una serie de intervalos de confianza de arranque a través deboot.ci
...Para simplificar, el conjunto de datos inicial consiste en 18 gatos (las observaciones de "nivel inferior") anidados en 6 laboratorios (la variable de agrupamiento). El conjunto de datos está equilibrado (
n_cluster = 3
para cada grupo). Tenemos un regresorx
, para explicary
.El conjunto de datos falso y la matriz donde almacenar los resultados son:
En cada una de las
B
iteraciones, el siguiente ciclo muestra 6 grupos con reemplazo, cada uno compuesto por 3 gatos muestreados sin reemplazo (es decir, la composición interna de los grupos se mantiene inalterada). Las estimaciones del coeficiente regresor y de su error estándar se almacenan en la matriz creada previamente:Espero que esto ayude, Lando
fuente
replicate
; Como bonificación, automáticamente te devuelve lab.sample
matriz. Además, con toda la fusión aquí, es casi seguro que sea mejor usardata.table
y volver a muestrearkey
. Puedo contribuir con una respuesta cuando llego a una computadora ... Pregunta: ¿por qué lleva un registro de los errores estándar de los coeficientes?quantile(b.sample[,2], c(.025, .975))
Aquí hay una manera mucho más simple (y casi indudablemente más rápida) de hacer el arranque utilizando
data.table
(en los datos de @ lando.carlissian):fuente
Tuve que hacer esto recientemente y lo usé
dplyr
. La solución no es tan elegante como condata.table
, pero:El
inner_join
repite cada fila que tiene un valor dadox
decluster
por el número de veces quex
aparece encluster_sample
.fuente
Hola, una solución muy simple basada en split y lapply, no necesita un paquete específico, excepto "boot", por ejemplo, con una estimación de ICC basada en el procedimiento nagakawa:
TERCERO: ejecución bootstrap
fuente