Chapter 2 BLOQUE 4: ampliación de simulación
Clase 1: Simulación de un modelo de regresión
Está cerca de entender un método que requiere de la simulación para la obtención de resultados. Sin embargo, antes va a aprender a simular datos sintéticos para poner a prueba ciertos resultados que conoce de los modelos de regresión lineal. ¿En qué consistirá esta simulación? Vayamos paso a paso.
Usted cuenta con una población que-en la vida real-suele estar formada por infinitos individuos y que, para R va a ser un modelo. En este caso, es un modelo de regresión lineal, por ejemplo:
\[ y=3+5x+u, \]
donde \(u\rightarrow N(0,\sigma=3)\). Usted no puede crear los infinitos elementos de esa población. Sin embargo, puede simular una muestra de dicha población. Por ejemplo, puede simular \(n=50\) elementos de dicha población. Es decir, su marco conceptual es el de la FIG1
Para ello, explore el siguiente:
Experimento 1
- Simule primero el error del modelo (mediante una normal de media cero y varianza 3)
<-rnorm(n,0,sd=3) u
-Simule valores para la variable \(x\). Recuerde que, bajo los supuestos generales del modelo de regresión lineal, \(x\) no es aleatoria y-por tanto, para fines de simulación-puede fijar los números de esa variable como desee.
<-runif(n) x
- Escriba la ecuación de regresión y ya tiene 50 elementos extraídos al azar de dicha población.
<-3+5*x+u y
- A continuación, puede utilizar el estimador de mínimos cuadrados (lm, en R) para tratar de recuperar los coeficientes del modelo poblacional
<-lm(y~x)
M0
:
CoefficientsPr(>|t|)
Estimate Std. Error t value 2.6615 0.7422 3.586 0.000785 ***
(Intercept) 4.8682 1.2149 4.007 0.000213 ***
x ---
: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Signif. codes
: 2.547 on 48 degrees of freedom
Residual standard error-squared: 0.2507, Adjusted R-squared: 0.2351
Multiple R-statistic: 16.06 on 1 and 48 DF, p-value: 0.0002132 F
¿Qué ha ocurrido?
Como verá, los coeficientes que obtiene, no tienen por qué ser
\[ \alpha=3,\beta=5 \]
puesto que usted ha cogido una única muestra al azar-representativa de la población- y, por tanto, lo que ha obtenido es una posible realización del experimento. Entonces ¿la estadística no me promete que-cada vez que haga el experimento- obtenga el verdadero valor de los parémetros? ¡No! la estadística lo que le promete es que, bajo ciertas propiedades de (en este caso, de la más importante es que la \(x\) y la \(u\) no estén relacionadas, esto es, sean independientes y el error aleatorio sea i.i.d) el estimador lineal de los parámetros será insesgado, es decir,
\[ E\left[\widehat{\alpha}\right]=\alpha \]
\[ E\left[\widehat{\beta}\right]=\beta \]
O lo que es lo mismo, si usted pudiera hacer este experimento infinitas veces, en promedio, las estimaciones que obtendría le proporcionarían el verdadero parámetro poblacional. Es decir, como ve en la FIG2,
sería lo equivalente en nuestro experimento a tomar un conjunto de muestras de tamaño \(n\) de nuestra población y hacer (en este caso hemos decidido 10.000 veces) el mismo experimento que antes para obtener 10000 posibles realizaciones de \(\widehat{\alpha},\widehat{\beta}.\)
Experimento 2 Este es el código que le permite obtener los 10.000 posibles valores paramétricos
<-vector()
b<-vector()
a<-50
nfor(i in 1:10000) {
<-rnorm(n,0,sd=3)
u<-runif(n)
x<-3+5*x+u
y<-lm(y~x)
M1<-M1$coefficients[1]
a[i]<-M1$coefficients[2]
b[i]
}
par(mfrow=c(1,2))
hist(a, main="histograma para a")
abline(v =3, col = "purple", lwd = 2)
hist(b, main="histograma para b")
abline(v =5, col = "blue", lwd = 2)
De esta forma, obtendrá los histogramas de la FIG3,
que representan la idea de la insesgadez: en promedio, nuestros estimadores están apuntando al verdadero valor poblacional, aunque-como ya sabe- lo normal es obtener el resultado de una única muestra (es decir, una única realización del experimento aleatorio) y utilizar dichos valores como si fueran los poblaciones. Ya que es la mejor estimación que puede tener.
¿Qué ha aprendido?
Este ejercicio de simulación le ha permitido comprobar cómo se comporta un estimador de un modelo de regresión si satisface las hipótesis habituales. Pese a que-en teoría- la propiedad de insesgadez es deseable y funciona, en la práctica usted sólo ha estimado el posible valor del parámetro utilizando una única muestra (que es lo equivalente al experimento 1) pese a que lo desesable, pero imposible, es el experimento 2.
Ahora bien, como se habrá dado cuenta, hemos especificado que-para que este experimento salga bien- debemos asegurarnos de que la variable \(x\) y la variable \(u\) sean independientes. Si no lo son, entonces, en general
\[ E\left[\widehat{\beta}\right]\neq\beta \]
es decir, los estimadores de las pendientes son sesgados. Esto es un problema, puesto que no podemos confiar, entonces, en la estimación obtenida.
Ejercicio resuelto. Investigue cómo generar una normal multivariante para las variables \(x,u\) de tal manera que, indicando la correlación deseada entre \(x,u\) pueda evaluar cómo es el tamaño del sesgo según dicha correlación es mayor (por ejemplo, hágalo para correlación de un 10%, de un 30% y de un 70% entre el error y la variable explicatova)
solución
install.packages("dplyr")
install.packages("tidyr")
install.packages("faux")
library(dplyr)
library(tidyr)
library(faux)
#correlación del 10%#
#usamos cmat para introducir la correlación. Se hace en los dos valores
#centrales del vector
<-vector()
a10<-vector()
b10<-50
nfor(i in 1:10000) {
<- c(1, .1,.1, 1)
cmat <- rnorm_multi(n, 2, 0, 1, cmat,
bvn varnames = c("x", "u"))
<-bvn$x
x<-bvn$u
u<-3+5*x+u
y<-lm(y~x)
M1<-M1$coefficients[1]
a10[i]<-M1$coefficients[2]
b10[i]
}
#correlación del 30%#
<-vector()
a30<-vector()
b30<-50
nfor(i in 1:10000) {
<- c(1, .3,.3, 1)
cmat <- rnorm_multi(n, 2, 0, 1, cmat,
bvn varnames = c("x", "u"))
<-bvn$x
x<-bvn$u
u<-3+5*x+u
y<-lm(y~x)
M1<-M1$coefficients[1]
a30[i]<-M1$coefficients[2]
b30[i]
}
#correlación del 70%#
<-vector()
a70<-vector()
b70<-50
nfor(i in 1:10000) {
<- c(1, .7,.7, 1)
cmat <- rnorm_multi(n, 2, 0, 1, cmat,
bvn varnames = c("x", "u"))
<-bvn$x
x<-bvn$u
u<-3+5*x+u
y<-lm(y~x)
M1<-M1$coefficients[1]
a70[i]<-M1$coefficients[2]
b70[i]
}
par(mfrow=c(3,2))
hist(a10, xlim = c(2,6), main="histograma para a, corr=0.1")
abline(v =3, col = "purple", lwd = 2)
hist(b10,xlim=c(2,6), main="histograma para b,corr=0.1")
abline(v =5, col = "blue", lwd = 2)
hist(a30,xlim=c(2,6), main="histograma para a,corr=0.3")
abline(v =3, col = "purple", lwd = 2)
hist(b30,xlim=c(2,6), main="histograma para b,corr=0.3")
abline(v =5, col = "blue", lwd = 2)
hist(a70,xlim=c(2,6), main="histograma para a,corr=0.7")
abline(v =3, col = "purple", lwd = 2)
hist(b70,xlim=c(2,6), main="histograma para b,corr=0.7")
abline(v =5, col = "blue", lwd = 2)
Como puede ver en la FIG 4, cuanto mayor sea la correlación entre el error y la variable explicativa, mayor es el sesgo cometido (de tal forma que el estimador se aleja del verdadero valor poblacional)
Ejercicio
Piense ahora en su proyecto del primer cuatrimestre. Si estimó modelos de regresión ¿tiene motivos para pensar que podría haber estimado coeficientes sesgados?
Clase 2: la técnica del bootstrapping
Todo lo que ha aprendido en las clases anteriores tenía un objetivo: entender la idea del bootstrapping. Debemos añadir, sin embargo, otra de las utilidades de la simulación para cerrar el círculo. Con la simulación también podemos resolver problemas de probabilidad.
- El muestreo con reemplazamiento
Esto ya lo ha hecho cuando resolvía los tediosos problemas de probabilidad con bolas de colores. En la FIG1, tenemos un ejemplo de muestreo con “reemplazamiento”. Tiene sus bolas originales, y la probabilidad de obtener una de cada color. Si quiere, por ejemplo, saber qué probabilidad tiene de sacar dos veces bola azul si una vez saca una bola la vuelve a depositar en la urna (reemplazamiento), tiene que darse cuenta de que son sucesos independientes y, por tanto \(P(azul|azul)=P(azul)\times P(azul)=\frac{1}{2}\times\frac{1}{2}=\frac{1}{4}\).
Esto lo puede simular en R. Por ejemplo, cree un vector donde \(1\) sea azul, \(2\) sea rojo y \(3\) sea negro.
=c(1,1,1,2,2,3) x
Utilizando la función sample, podrá simular cualquier salida de la urna. Por ejemplo, aquí le estamos diciendo que saque dos bolas con reemplazamiento (es decir, R saca una bola, vuelve a depositarla en la urna, y saca de nuevo otra)
sample(x, 2, replace = TRUE)
Tomando el resultado frecuentista de que
\[ P(azul|azul)=\frac{veces\: que\: salen\:2\: bolas\: azules}{veces\:totales} \]
generamos un código que nos permita obtener-simulando un conjunto de casos posibles- el número de favorables. Deberá aproximarse dicho resultado a la probabilidad real que es 0.25.
for(i in 1:10000) {
<-sample(x, 2, replace = TRUE)
yif (y[1]==1 && y[2]==1){
<-count+1}
count
}
=count/10000
Prob
> Prob
1] 0.2475 [
- Muestreo sin reemplazamiento
Lo mismo ocurrirá si hace el muestreo sin reemplazamiento. en este caso, la probabilidad de obtener azul una vez se ha obtenido azul no es independiente, puesto que el número de bolas será distinto. Entonces, tendrá que ocurrir lo que ve en la FIG2
=c(1,1,1,2,2,3)
x
<-0
count
for(i in 1:10000) {
<-sample(x, 2, replace = FALSE)
yif (y[1]==1 && y[2]==1){
<-count+1}
count
}
=count/10000
Prob
> Prob
1] 0.2035 [
La idea del bootstrapping consiste en lo siguiente: usted tiene unos datos originales, por ejemplo, la muestra de la FIG3
Ahora, usted obtiene una estimación para \(\alpha\) y para \(\beta\) y se pregunta ¿podría tener una distribución? Entonces, va a asumir que esa muestra es su población (es una asunción, no es la realidad) y, entonces, va a hacer muestreos con reemplazamiento de los pares que tiene, de tal forma que pueda estimar modelos de regresión alternativos
Como ve, cada iteración que hace, es como si sorteara en la urna qué elementos de la muestra se utilizan y en qué proporción. Habrá elementos (bolas) que no saque en una iteración y otras que las saque muchas veces. Como ve, lo que está haciendo es generar muchas muestras alternativas a partir de una única muestra.
Esta técnica es útil para:
- Obtener intervalos de confianza para parámetros cuando el modelo no lo permite (piense en modelos complicados, donde no se puede obtener una expresión analítica de las varianzas)
- Obtener intervalos de confianza para parámetros cuando los errores no siguen una distribución normal (y la muestra es pequeña)
- Obtener intervalos de confianza para predicciones
Vea cómo utilizarla. Por ejemplo, generamos un modelo de regresión lineal donde todo funciona. Entonces, el script del bootstrap es el siguiente
#declaramos los vectores donde guardaremos las estimaciones
<-vector()
b<-vector()
a#generamos la muestra aleatoria del modelo de regresión
set.seed(123)
<-100
n<-rnorm(n,0,sd=3)
u<-runif(n)
x<-3+5*x+u
y#estimamos un primer modelo base
<-lm(y~x)
M0
for(i in 1:10000) {
<-sample(c(1:n), n, replace = TRUE)
id<-x[id]
X<-y[id]
Y<-lm(Y~X)
M1<-M1$coefficients[1]
a[i]<-M1$coefficients[2]
b[i]
}
par(mfrow=c(1,2))
hist(a, main="histograma para a")
abline(v =3, col = "purple", lwd = 2)
hist(b, main="histograma para b")
abline(v =5, col = "blue", lwd = 2)
De hecho, puede comprobar cómo los intervalos de confianza que obtiene son similares. Mediante el modelo :
#esta es la regresión inicial#
> summary(M0)
:
Calllm(formula = y ~ x)
:
CoefficientsPr(>|t|)
Estimate Std. Error t value 3.0196 0.5325 5.671 1.44e-07 ***
(Intercept) 5.5177 0.9384 5.880 5.69e-08 ***
x
: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Signif. codes
: 3.086 on 48 degrees of freedom
Residual standard error-squared: 0.2106, Adjusted R-squared: 0.1941
Multiple R-statistic: 12.8 on 1 and 48 DF, p-value: 0.0008027 F
Donde un Intervalo de confianza para el parámetro \(\beta\) se obiene como
\[ IC\left(\beta\right)_{\left(1-\alpha\right)\%}\equiv\left(5.51-1.96\times0.9384,5.51+1.96\times0.9384\right)=(3.6707,7.349) \]
Como puede ver, si calculamos el IC mediante los resultados del bootstrap, tendremos
> quantile(b, c(.025, .5, .975))
2.5% 50% 97.5%
3.690361 5.502940 7.38899
que es un intervalo similar. Ahora bien, ¿qué ocurre si los errores no se distribuyen de forma normal? En este caso, pedimos que los errores se distribuyan de manera uniforme.
<-vector()
b<-vector()
aset.seed(123)
<-50
n<-runif(n,-3,3)
u<-runif(n)
x<-3+5*x+u
y<-lm(y~x)
M0
for(i in 1:10000) {
<-sample(c(1:n), n, replace = TRUE)
id<-x[id]
X<-y[id]
Y<-lm(Y~X)
M1<-M1$coefficients[1]
a[i]<-M1$coefficients[2]
b[i]
}
En este caso, es importante notar que la hipótesis principal para obtener intervalos de confianza de parámetros en modelos de regresión lineal, como ya se vio, es que los errores se distribuyan normal. Partiendo del modelo original de regresión, obtenido con los datos simulados (con error NO normal), calculamos el intervalo de confianza para los parámetros obtenido como si los errores fueran normales
#esta es la regresión inicial#
> summary(M0)
:
Calllm(formula = y ~ x)
:
CoefficientsPr(>|t|)
Estimate Std. Error t value 2.8818 0.5051 5.705 7.05e-07 ***
(Intercept) 5.5005 0.9183 5.990 2.60e-07 ***
x ---
---
: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Signif. codes
: 3.086 on 48 degrees of freedom
Residual standard error-squared: 0.2106, Adjusted R-squared: 0.1941
Multiple R-statistic: 12.8 on 1 and 48 DF, p-value: 0.0008027 F
Donde un Intervalo de confianza para el parámetro \(\beta\) se obiene como
\[ IC\left(\beta\right)_{\left(1-\alpha\right)\%}\equiv\left(5.50-1.96\times0.9183,5.50+1.96\times0.9183\right)=(3.7001,7.2998) \]
mientras que el intervalo, calculado con la muestra bootstrap, será
> quantile(b, c(.025, .5, .975))
2.5% 50% 97.5%
3.598279 5.506940 7.382569
que difiere del calculado asumiendo normalidad y que, en el caso de distribuciones de errores con mayor asmetría, etc… podría dar resultados mucho más diferentes.
Ejemplo resuelto de predicción con Bootstrapp aplicado a una muestra real
Objetivo Aplicar la técnica del bootstrap a unos datos reales y entender la utilidad.
- Con los datos de los Simpson, pretendemos estimar los coeficientes de un modelo de regresión,
\[ audiencia_i=\beta_0+\beta_1 rating_i+\beta_2season_i+\beta_3homer_i+u_i \]
donde \(u_i\) es un error aleatorio con media cero y varianza constante.
- Mediante bootstrap, obtendremos una estimación de la función de densidad de los parámetros
library(readr)
<- read_table2("SIMPSONS_FINAL.csv", locale = locale(decimal_mark = ","))
SIMPSONS<-na.omit(SIMPSONS)
SIMPSONS<-SIMPSONS$millions_audiene
audiencia<-SIMPSONS$rating_imdb
rating<-SIMPSONS$season
Season<-SIMPSONS$Homer
Homer<-dim(SIMPSONS)[1]
n
<-vector()
a<-vector()
b<-vector()
c<-vector()
d
for(i in 1:10000) {
<-sample(c(1:n), n, replace = TRUE)
id<-rating[id]
X1<-Season[id]
X2<-Homer[id]
X3<-audiencia[id]
Y<-lm(Y~X1+X2+X3)
M1<-M1$coefficients[1]
a[i]<-M1$coefficients[2]
b[i]<-M1$coefficients[3]
c[i]<-M1$coefficients[4]
d[i] }
Como ya ha entendido, en este curso tratamos de evitar los contrastes de hipótesis habituales para dar respuesta a preguntas que, en realidad, son complejas. ¿Cómo podremos usar el bootstrap para ilustrar el impacto cuantitativo de las variables de interés?
Puede entonces,
- Analizar cuál es la distribución del posible efecto en la audiencia de un incremento “promedio” de las variables Homer y rating
- Para ello, piense que no es lo mismo aumentar una unidad en la variable Homer que una unidad en la variable rating. Recuerde que para cada una de las variables puede obtener su desviación típica, puesto que le informa de la variación promedio de dichas variables en la muesrtra.
- Si multiplica dicho impacto promedio por los coeficientes obtenidos en el bootstrap, tendrá la distribución del efecto de cada una de estas variables sobre la audiencia
- ¿Cuál parece tener mayor efecto sobre la audiencia? Haga un gráfico con los dos efectos (en valor absoluto) y analice cuál podría tener mayor impacto sobre la audiencia
<-sd(rating)
im_rat<-sd(Homer)
im_Homer
hist( abs(im_rat*b), col=rgb(0,0,1,1/4), xlim=c(0,1),main="Histograma de los efectos potenciales") # first histogram
hist( abs(im_Homer*d), col=rgb(1,0,0,1/4), xlim=c(0,1), add=T) # second
La variable rating (morada) tiene un impacto potencial, sobre la audiencia, mucho más remarcable que las apariciones de Homer.
Por otro lado, puede hacer predicción condicional. Por ejemplo, ¿cuál será la distribución de la predicción para la audiencia de la temporada 27 en un episodio con un 6 de nota media y con 200 líneas de guión de Homer?
#predicción para la temporada 27 de la audiencia de un episodio con un 6 de nota media de Rating y 200 líneas de
#guion de Homer
<-a+b*6+c*27+d*200 pred_simpsons
¿Cómo comentaría este resultado?
** Fin del Bloque**
En este bloque ha aprendido a entender una técnica de mucha utilidad en el mundo de la ciencia de datos: la simulación. Con suerte, además, habrá tenido la oportunidad de seguir discutiendo conceptos que lleva ya, años, viendo en estadística y que, quizás, no define y entiende con precisión.