Solo otra variante que es algo simplista, pero creo que entregar el mensaje sin usar explícitamente la biblioteca boot
que puede confundir a algunas personas con la sintaxis que usa.
Tenemos un modelo lineal: ,y=Xβ+ϵϵ∼N(0,σ2)
La siguiente es una rutina de arranque paramétrica para ese modelo lineal, lo que significa que no volveremos a muestrear nuestros datos originales, pero en realidad generamos nuevos datos a partir de nuestro modelo ajustado. Además, suponemos que la distribución de arranque del coeficiente de regresión es simétrica y que la traducción es invariante. (Hablando en términos generales de que podemos mover su eje afectando sus propiedades) La idea detrás es que las fluctuaciones en los 's se deben a y, por lo tanto, con suficientes muestras deberían proporcionar una buena aproximación de la distribución real de 's. Como antes, probamos nuevamente y definimos nuestros valores p comoββϵβH0:0=βj"la probabilidad, dada una hipótesis nula para la distribución de probabilidad de los datos, de que el resultado sería tan extremo o más extremo que el resultado observado" (donde los resultados observados en este caso son los's que obtuvimos para nuestro modelo original). Entonces aquí va:β
# Sample Size
N <- 2^12;
# Linear Model to Boostrap
Model2Boot <- lm( mpg ~ wt + disp, mtcars)
# Values of the model coefficients
Betas <- coefficients(Model2Boot)
# Number of coefficents to test against
M <- length(Betas)
# Matrix of M columns to hold Bootstraping results
BtStrpRes <- matrix( rep(0,M*N), ncol=M)
for (i in 1:N) {
# Simulate data N times from the model we assume be true
# and save the resulting coefficient in the i-th row of BtStrpRes
BtStrpRes[i,] <-coefficients(lm(unlist(simulate(Model2Boot)) ~wt + disp, mtcars))
}
#Get the p-values for coefficient
P_val1 <-mean( abs(BtStrpRes[,1] - mean(BtStrpRes[,1]) )> abs( Betas[1]))
P_val2 <-mean( abs(BtStrpRes[,2] - mean(BtStrpRes[,2]) )> abs( Betas[2]))
P_val3 <-mean( abs(BtStrpRes[,3] - mean(BtStrpRes[,3]) )> abs( Betas[3]))
#and some parametric bootstrap confidence intervals (2.5%, 97.5%)
ConfInt1 <- quantile(BtStrpRes[,1], c(.025, 0.975))
ConfInt2 <- quantile(BtStrpRes[,2], c(.025, 0.975))
ConfInt3 <- quantile(BtStrpRes[,3], c(.025, 0.975))
Como se mencionó, la idea es que la distribución de arranque de aproxima a la verdadera. (Claramente, este código está optimizado para la velocidad pero para la legibilidad. :))β