-
Notifications
You must be signed in to change notification settings - Fork 27
/
Copy path05-bootstrap_no_parametrico.Rmd
1871 lines (1435 loc) · 71.1 KB
/
05-bootstrap_no_parametrico.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
# Bootstrap no paramétrico
> Bootstrap: _to pull oneself up by one's bootstrap_
Estas notas se desarrollaron con base en @efron, adicionalmente se usaron ideas
de @tim. Abordamos los siguientes temas:
* Muestras aleatorias
* El principio del _plug-in_
* Bootstrap no paramétrico
* Ejemplos: componentes principales, ajuste de curvas, muestreo.
<!-- la inferencia estadística se ocupa de aprender de la experiencia:
observamos una muestra aleatoria x y queremos inferir propiedades de la
población que produjo la muestra. Probabilidad va en la dirección contraria:
de la composicion de una pob deducimos las propiedades de una muestra aleatoria
x -->
#### Ejemplo: aspirina y ataques cardiacos {-}
Como explican Efron y Tibshirani, las
explicaciones del *bootstrap* y otros métodos computacionales involucran
las ideas de inferencia estadistica tradicional. Las ideas báscias no han
cambiado pero la implementación de estas sí.
Los tres conceptos básicos de estadística son:
1. Recolección de datos,
2. resúmenes (o descriptivos) de datos y
3. inferencia.
Veamos un ejemplo de estos conceptos y como se introduce bootstrap. Usaremos
datos de un estudio clínico de consumo de aspirina y ataques cardiacos cuyos
resultados fueron publicados en el [New York Times](http://www.nytimes.com/1988/01/27/us/heart-attack-risk-found-to-be-cut-by-taking-aspirin.html):
**Planteamiento:** se diseñó un estudio para investigar si el consumo de dosis
bajas de aspirina podía prevenir los ataques cardiacos en hombres sanos en edad
media.
**Recolección de datos:** Se hizo un diseño controlado, aleatorizado y
doblemente ciego. La mitad de los participantes recibieron aspirina y la otra
mitad un placebo.
**Descriptivos:** Las estadísticas descriptivas del artículo son muy sencillas:
<div class="mi-tabla">
grupo | ataques cardiacos | sujetos
---------|-------------------|---------
aspirina | 104 | 11037
placebo | 189 | 11034
</div>
De manera que la estimación del cociente de las tasas es
$$\hat{\theta}=\frac{104/11037}{189/11034} = 0.55$$
En la muestra los individuos que toman aspirina tienen únicamente 55\% de
los ataques que los que toman placebo. Sin embargo, lo que realmente nos
interesa es $\theta$: el cociente de tasas que observaríamos si pudieramos
tratar a todos los hombres y no únicamente a una muestra.
**Inferencia:** aquí es donde recurrimos a inferencia estadística:
$$0.43 < \theta < 0.70$$
El verdadero valor de $\theta$ esta en el intervalo $(0.43,0.70)$ con una
confianza del 95%.
Ahora, el **bootstrap** es un método de simulación basado en datos para
inferencia estadística. La idea detrás es que si una muestra es una aproximación
de la población que la generó, entoces podemos hacer muestreos de la muestra
para calcular una estadística de interés y medir la exactitud en la misma.
En este caso tenemos los resultados del experimento en la variable *trial*.
```{r datos_bootstrap}
trial <- tibble(patient = 1:22071,
group = ifelse(patient <= 11037, "aspirin", "control"),
heart_attack = c(rep(TRUE, 104), rep(FALSE, 10933), rep(TRUE, 189),
rep(FALSE, 10845)))
trial
```
Y calculamos el cociente de las tasas:
```{r bootstrap_summary}
summary_stats <- trial %>%
group_by(group) %>%
summarise(
n_attacks = sum(heart_attack),
n_subjects = n(),
rate_attacks = n_attacks / n_subjects * 100
)
summary_stats
ratio_rates <- summary_stats$rate_attacks[1] / summary_stats$rate_attacks[2]
ratio_rates
```
Después calculamos 1000 replicaciones *bootstrap* de $\hat{\theta*}$
```{r replicaciones_bootstrap}
boot_ratio_rates <- function(){
boot_sample <- trial %>%
group_by(group) %>%
sample_frac(replace = TRUE)
rates <- boot_sample %>%
summarise(rate_attacks = sum(heart_attack) / n()) %>%
pull(rate_attacks)
rates[1] / rates[2]
}
boot_ratio_rates <- rerun(1000, boot_ratio_rates()) %>%
flatten_dbl()
```
Las replicaciones se pueden utilizar para hacer inferencia de los datos. Por
ejemplo, podemos estimar el error estándar de $\theta$:
```{r inferencias_bootstrap, fig.align='center', fig.width=4, fig.height=4}
se <- sd(boot_ratio_rates)
comma(se)
```
## El principio del plug-in
### Muestras aleatorias {-}
Supongamos que tenemos una población finita o _universo_ $U$, conformado
por unidades individuales con propiedades que nos gustaría aprender (opinión
política, nivel educativo, preferencias de consumo, ...). Debido a que es muy
difícil y caro examinar cada unidad en $U$ seleccionamos una muestra aleatoria.
<div class="caja">
Una **muestra aleatoria** de tamaño $n$ se define como una colección de $n$
unidades $u_1,...,u_n$ seleccionadas aleatoriamente de una población $U$.
Una vez que se selecciona una muestra aleatoria, los **datos observados** son la colección de medidas $x_1,...,x_n$, también denotadas
$\textbf{x} = (x_1,...,x_n)$.
</div>
En principio, el proceso de muestreo es como sigue:
1. Seleccionamos $n$ enteros de manera independiente (con probabilidad $1/N$),
cada uno de ellos asociado a un número entre $1$ y $N$.
2. Los enteros determinan las unidades que seleccionamos y tomamos medidas
a cada unidad.
En la práctica el proceso de selección suele ser más complicado y la
definición de la población $U$ suele ser deficiente; sin embargo, el marco
conceptual sigue siendo útil para entender la inferencia estadística.
<div class="caja">
Nuestra definición de muestra aleatoria comprende muestras con y sin reemplazo:
* **muestra sin reemplazo:** una unidad particular puede aparecer a lo más una
vez.
* **muestra con reemplazo:** permite que una unidad aparezca más de una vez.
</div>
* Es más común tomar muestras sin remplazo, sin embargo, **para hacer inferencia
suele ser más sencillo permitir repeticiones (muestreo con
remplazo)** y si el tamaño de la muestra $n$ es mucho más chico que la población
$N$, la probabilidad de muestrear la misma unidad más de una vez es chica.
* El caso particular en el que obtenemos las medidas de interés de cada unidad
en la población se denomina **censo**, y denotamos al conjunto de datos
observados de la población por $\mathcal{X}$.
En general, no nos interesa simplemente describir la muestra que observamos
sino que queremos aprender acerca de la población de donde se seleccionó la
muestra:
<div class="caja">
El objetivo de la **inferencia estadística** es expresar lo que hemos aprendido
de la población $\mathcal{X}$ a partir de los datos observados $\textbf{x}$.
</div>
#### Ejemplo: ENLACE {-}
Veamos un ejemplo donde tomamos una muestra de 300 escuelas primarias
del Estado de México, de un universo de 7,518 escuelas,
```{r seleccion_muestra}
library(estcomp)
# universo
enlace <- enlacep_2013 %>%
janitor::clean_names() %>%
mutate(id = 1:n()) %>%
select(id, cve_ent, turno, tipo, esp_3 = punt_esp_3, esp_6 = punt_esp_6,
n_eval_3 = alum_eval_3, n_eval_6 = alum_eval_6) %>%
na.omit() %>%
filter(esp_3 > 0, esp_6 > 0, n_eval_3 > 0, n_eval_6 > 0, cve_ent == "15")
glimpse(enlace)
set.seed(16021)
n <- 300
# muestra
enlace_muestra <- sample_n(enlace, n) %>%
mutate(clase = "muestra")
```
para cada escuela en la muestra consideremos la medida $x_i$, conformada por el
promedio de las calificaciones en español de los alumnos de tercero y sexto
de primaria (prueba ENLACE 2010):
$$x_i=(esp_{3i}, esp_{6i})$$
En este ejemplo contamos con un censo de las escuelas y tomamos la muestra
aleatoria de la tabla de datos general, sin embargo, es común contar únicamente
con la muestra.
Para español 3^o^ de primaria la media observada es
```{r}
mean(enlace_muestra$esp_3)
```
La media muestral es una estadística descriptiva de la muestra, pero también la
podemos usar para describir a la población de escuelas.
Al usar la media observada para describir a la población estamos aplicando el
principio del *plug-in* que dice que una característica dada de una distribución
puede ser aproximada por la equivalente evaluada en la distribución empírica de
una muestra aleatoria.
### Función de distribución empírica {-}
<div class="caja">
Dada una muestra aleatoria de tamaño $n$ de una distribución de probabilidad
$P$, la **función de distribución empírica** $P_n$ se define como la
distribución que asigna probabilidad $1/n$ a cada valor $x_i$ con $i=1,2,...,n$.
En otras palabras, $P_n$ asigna a un conjunto $A$ en el espacio muestral de $x$
la probabilidad empírica:
$$P_n(A)=\#\{x_i \in A \}/n$$
</div>
<!--Ahora, muchos problemas de inferencia estadística involucran la estimación
de algún aspecto de una distribución de de probabilidad $P$ en base a una
muestra aleatoria obtenida de $P$. -->
* La función de distribución empírica $P_n$ es una estimación de la distribución
completa $P$, por lo que una manera inmediata de estimar aspectos de $P$
(e.g media o mediana) es calcular el aspecto correspondiente de $P_n$.
* En cuanto a la teoría el principio del *plug-in* está soportado por el teorema
de [Glivenko Cantelli](https://www.stat.berkeley.edu/~bartlett/courses/2013spring-stat210b/notes/8notes.pdf):
Sea $X_1,...,X_n$ una muestra aleatoria de una distribución $P$, con
distribución empírica $P_n$ entonces
$$\sup_{x \in \mathcal{R}}|P_n(x)-P(x)|\to_p0$$
casi seguro.
Regresando al ejemplo de las escuelas, comparemos la distribución poblacional y
la distribución empírica.
```{r distribucion_empirica, fig.width=5, fig.height=4}
enlace_long <- enlace %>%
mutate(clase = "población") %>%
bind_rows(enlace_muestra) %>%
gather(grado, calif, esp_3:esp_6)
ggplot(enlace_long, aes(x = calif)) +
geom_histogram(aes(y = ..density..), binwidth = 20, fill = "darkgray") +
facet_grid(grado ~ clase)
```
Podemos comparar la función de distribución acumulada empírica y la función de
distribución acumulada poblacional:
En la siguiente gráfica la curva roja
representa la función de distribución acumulada empírica y la curva con relleno
gris la función de distribución acumulada poblacional.
```{r, fig.height=3.5, fig.width=5}
ggplot() +
stat_ecdf(data = filter(enlace_long, clase == "población"),
aes(x = calif, ymin = 0, ymax = ..y..), geom = "ribbon", pad = TRUE,
alpha = 0.5,
fill = "gray", color = "darkgray") +
stat_ecdf(data = filter(enlace_long, clase == "muestra"),
aes(x = calif), geom = "step", color = "red") +
facet_grid(~ grado) +
labs(color = "")
```
Cuando la variable de interés toma pocos valores es fácil ver la distribución
empírica, supongamos que la medición de las unidades que nos interesa es la
variable tipo de escuela, entonces la distribución empírica en la muestra es
```{r dist_empirica_categorica}
table(enlace_muestra$tipo) / n
```
Vale la pena notar que pasar de la muestra desagregada a la distribución
empírica (lista de valores y la proporción que ocurre cada una en la muestra)
no conlleva ninguna pérdida de información:
_el vector de frecuencias observadas es un **estadístico suficiente** para la
verdadera distribución._
Esto quiere decir que toda la información de $P$ contenida en el vector de
observaciones $\textbf{x}$ está también contenida en $P_n$.
**Nota**: el teorema de suficiencia asume que las observaciones $\textbf{x}$ son
una muestra aleatoria de la distribución $P$, este no es siempre el caso
(e.g. si tenemos una serie de tiempo).
### Parámetros y estadísticas {-}
Cuando aplicamos teoría estadística a problemas reales, es común que las
respuestas estén dadas en términos de distribuciones de probabilidad. Por
ejemplo, podemos preguntarnos que tan correlacionados están los resultados de
las pruebas de español correspondientes a 3^o^ y 6^o^. Si conocemos la
distribución de probabilidad $P$ contestar esta pregunta es simplemente cuestión
de aritmética, el coeficiente de correlación poblacional esta dado por:
$$corr(y,z) = \frac{\sum_{j=1}^{N}(Y_j - \mu_y)(Z_j-\mu_z)}
{[\sum_{j=1}^{N}(Y_j - \mu_y)^2\sum_{j=1}^{N}(Z_j - \mu_z)^2]^{1/2}}$$
en nuestro ejemplo $(Y_j,Z_j)$ son el j-ésimo punto en la población de escuelas
primarias $\mathcal{X}$, $\mu_y=\sum Y_j/3311$ y $\mu_z=\sum Z_j/3311$.
```{r grafica_corr, fig.width=4, fig.height=4, out.width="300px"}
ggplot(enlace, aes(x = esp_3, y = esp_6)) +
geom_point(alpha = 0.5)
cor(enlace$esp_3, enlace$esp_6) %>% round(2)
```
Si no tenemos un censo debemos inferir, podríamos estimar la correlación
$corr(y,z)$ a través del coeficiente de correlación muestral:
$$\hat{corr}(y,z) = \frac{\sum_{j=1}^{n}(y_j - \hat{\mu}_y)(z_j-\hat{\mu}_z)}
{[\sum_{j=1}^{n}(y_j - \hat{\mu}_y)^2\sum_{j=1}^{n}(z_j - \hat{\mu}_z)^2]^{1/2}}$$
recordando que la distribución empírica es una estimación de la distribución
completa.
```{r correlacion}
cor(enlace_muestra$esp_3, enlace_muestra$esp_6)
```
Al igual que la media esto es una estimación _plug-in_. Otros ejemplos son:
* Supongamos que nos interesa estimar la mediana de las calificaciones
de español para 3^o de primaria:
```{r mediana_esp3}
median(enlace_muestra$esp_3)
```
* Supongamos que nos interesa estimar la probabilidad de que la calificación de
español de una escuela sea mayor a 700:
$$\theta=\frac{1}{N}\sum_{j=1}^N I_{\{Y_i>700\}}$$
donde $I_{\{\cdot\}}$ es la función indicadora.
La estimación _plug-in_ de $\hat{\theta}$ sería:
```{r calif_700}
sum(enlace_muestra$esp_3 > 700) / n
```
#### Ejemplo: dado {-}
Observamos 100 lanzamientos de un dado, obteniendo la siguiente distribución
empírica:
```{r dado}
dado <- read.table("data/dado.csv", header = TRUE, quote = "\"")
prop.table(table(dado$x))
```
En este caso no tenemos un censo, solo contamos con la muestra. Una pregunta
de inferencia que surge de manera natural es si el dado es justo, esto es,
si la distribución que generó esta muestra tiene una distribución
$P = (1/6, 1/6, 1/6,1/6, 1/6, 1/6)$.
Para resolver esta pregunta, debemos hacer inferencia de la distribución
empírica.
Antes de proseguir repasemos dos conceptos importantes: parámetros y
estadísticos:
<div class='caja'>
Un **parámetro** es una función de la distribución de probabilidad
$\theta=t(P)$, mientras que una **estadística** es una función de la
muestra $\textbf{x}$.
</div>
Por ejemplo, la $corr(x,y)$ es un parámetro de $P$ y $\hat{corr}(x,y)$ es una
estadística con base en $\textbf{x}$ y $\textbf{y}$.
Entonces:
<div class="caja">
El **principio del _plug-in_** es un método para estimar parámetros a
partir de muestras; la estimación _plug-in_ de un parámetro $\theta=t(P)$ se
define como:
$$\hat{\theta}=t(P_n).$$
</div>
Es decir, estimamos la función $\theta = t(P)$ de la distribución de
probabilidad $P$ con la misma función aplicada en la distribución empírica
$\hat{\theta}=t(P_n)$.
¿Qué tan _bien_ funciona el principio del _plug-in_?
Suele ser muy bueno cuando la única información disponible de $P$ es la
muestra $\textbf{x}$, bajo esta circunstancia $\hat{\theta}=t(P_n)$ no puede
ser superado como estimador de $\theta=t(P)$, al menos no en el sentido
asintótico de teoría estadística $(n\to\infty)$.
El principio del _plug-in_ provee de una estimación más no habla de precisión:
usaremos el bootstrap para estudiar el sesgo y el error estándar del
estimador _plug-in_ $\hat{\theta}=t(P_n)$.
### Distribuciones muestrales y errores estándar {-}
<div class="caja">
La **distribución muestral** de una estadística es la distribución de
probabilidad de la misma, considerada como una variable aleatoria.
</div>
Es así que la distribución muestral depende de:
1) La distribución poblacional,
2) la estadística que se está considerando,
y 3) la muestra aleatoria: cómo se seleccionan las unidades de la muestra y
cuántas.
En teoría para obtener la distribución muestral uno seguiría los siguientes
pasos:
* Selecciona muestras de una población (todas las posibles o un número infinito
de muestras).
* Calcula la estadística de interés para cada muestra.
* __La distribución de la estadística es la distribución muestral.__
```{r, eval = FALSE}
library(LaplacesDemon)
library(patchwork)
# En este ejemplo la población es una mezcla de normales
pob_plot <- ggplot(data_frame(x = -15:20), aes(x)) +
stat_function(fun = dnormm, args = list(p = c(0.3, 0.7), mu = c(-2, 8),
sigma = c(3.5, 3)), alpha = 0.8) +
geom_vline(aes(color = "mu", xintercept = 5), alpha = 0.5) +
scale_colour_manual(values = c('mu' = 'red'), name = '',
labels = expression(mu)) +
labs(x = "", subtitle = "Población", color = "")
samples <- data_frame(sample = 1:3) %>%
mutate(
sims = rerun(3, rnormm(30, p = c(0.3, 0.7), mu = c(-2, 8),
sigma = c(3.5, 3))),
x_bar = map_dbl(sims, mean))
muestras_plot <- samples %>%
unnest() %>%
ggplot(aes(x = sims)) +
geom_histogram(binwidth = 2, alpha = 0.5, fill = "darkgray") +
geom_vline(xintercept = 5, color = "red", alpha = 0.5) +
geom_segment(aes(x = x_bar, xend = x_bar, y = 0, yend = 0.8),
color = "blue") +
xlim(-15, 20) +
facet_wrap(~ sample) +
geom_text(aes(x = x_bar, y = 0.95, label = "bar(x)"), parse = TRUE,
color = "blue", alpha = 0.2, hjust = 1) +
labs(x = "", subtitle = "Muestras")
samples_dist <- data_frame(sample = 1:10000) %>%
mutate(
sims = rerun(10000, rnormm(100, p = c(0.3, 0.7), mu = c(-2, 8),
sigma = c(3.5, 3))),
mu_hat = map_dbl(sims, mean))
dist_muestral_plot <- ggplot(samples_dist, aes(x = mu_hat)) +
geom_density(adjust = 2) +
labs(x = "", subtitle = expression("Distribución muestral de "~hat(mu))) +
geom_vline(xintercept = 5, color = "red", alpha = 0.5)
(pob_plot | plot_spacer()) / (muestras_plot | dist_muestral_plot)
```
![](img/ideal_world.png)
Para hacer inferencia necesitamos describir la forma de la distribución
muestral, es natural pensar en la desviación estándar pues es una medida de la
dispersión de la distribución de la estadística alrededor de su media:
<div class="caja">
El **error estándar** es la desviación estándar de la distribución muestral de
una estadística.
</div>
#### Ejemplo: el error estándar de una media {-}
Supongamos que $x$ es una variable aleatoria que toma valores en los reales con
distribución de probabilidad $P$. Denotamos por $\mu_P$ y $\sigma_P^2$ la
media y varianza de $P$,
$$\mu_P = E_P(x),$$
$$\sigma_P^2=var_P(x)=E_P[(x-\mu_P)^2]$$
en la notación enfatizamos la dependencia de la media y varianza en la
distribución $P$.
Ahora, sea $(x_1,...,x_n)$ una muestra aleatoria de $P$, de tamaño $n$,
la media de la muestra $\bar{x}=\sum_{i=1}^nx_i/n$ tiene:
* esperanza $\mu_P$,
* varianza $\sigma_P^2/n$.
En palabras: la esperanza de $\bar{x}$ es la misma que la esperanza de $x$, pero
la varianza de $\bar{x}$ es $1/n$ veces la varianza de $x$, así que entre
mayor es la $n$ tenemos una mejor estimación de $\mu_P$.
En el caso de la media $\bar{x}$, el error estándar, que denotamos
$se_P(\bar{x})$, es la raíz de la varianza de $\bar{x}$,
$$se_P(\bar{x}) = [var_P(\bar{x})]^{1/2}= \sigma_P/ \sqrt{n}.$$
En este punto podemos usar el principio del _plug-in_, simplemente sustituimos
$P_n$ por $P$ y obtenemos, primero, una estimación de $\sigma_P$:
$$\hat{\sigma}=\hat{\sigma}_{P_n} = \bigg\{\frac{1}{n}\sum_{i=1}^n(x_i-\bar{x})^2\bigg\}^{1/2}$$
de donde se sigue la estimación del error estándar:
$$\hat{se}(\bar{x})=\hat{\sigma}_{P_n}/\sqrt{n}=\bigg\{\frac{1}{n^2}\sum_{i=1}^n(x_i-\bar{x})^2\bigg\}^{1/2}$$
Notemos que usamos el principio del _plug-in_ en dos ocasiones, primero para
estimar la esperanza $\mu_P$ mediante $\mu_{P_n}$ y luego para estimar el
error estándar $se_P(\bar{x})$.
![](img/manicule2.jpg) Consideramos los datos de ENLACE edo. de México
(`enlace`), y la columna de calificaciones de español 3^o^ de primaria (`esp_3`).
- Selecciona una muestra de tamaño $n = 10, 100, 1000$. Para cada muestra
calcula media y el error estándar de la media usando el principio del *plug-in*:
$\hat{\mu}=\bar{x}$, y $\hat{se}(\bar{x})=\hat{\sigma}_{P_n}/\sqrt{n}$.
- Ahora aproximareos la distribución muestral, para cada tamaño de muestra $n$:
i) simula 10,000 muestras aleatorias, ii) calcula la media en cada muestra, iii)
Realiza un histograma de la distribución muestral de las medias (las medias del
paso anterior) iv) aproxima el error estándar calculando la desviación estándar
de las medias del paso ii.
- Calcula el error estándar de la media para cada tamaño de muestra usando la
información poblacional (ésta no es una aproximación), usa la fórmula:
$se_P(\bar{x}) = \sigma_P/ \sqrt{n}$.
- ¿Cómo se comparan los errores estándar correspondientes a los distintos
tamaños de muestra?
#### ¿Por qué bootstrap? {-}
* En el caso de la media $\hat{\theta}=\bar{x}$ la aplicación del principio del
_plug-in_ para el cálculo de errores estándar es inmediata; sin embargo, hay
estadísticas para las cuáles no es fácil aplicar este método.
* El método de aproximarlo con simulación, como lo hicimos en el ejercicio de
arriba no es factible pues en la práctica no podemos seleccionar un número
arbitrario de muestras de la población, sino que tenemos únicamente una muestra.
* La idea del *bootstrap* es replicar el método de simulación para aproximar
el error estándar, esto es seleccionar muchas muestras y calcular la estadística
de interés en cada una, con la diferencia que las muestras se seleccionan de la
distribución empírica a falta de la distribución poblacional.
## El estimador bootstrap del error estándar
Entonces, los pasos para calcular estimador bootstrap del error estándar son:
Tenemos una muestra aleatoria $\textbf{x}=(x_1,x_2,...,x_n)$
proveniente de una distribución de probabilidad desconocida $P$,
1. Seleccionamos muestras aleatorias con reemplazo de la distribución empírica.
2. Calculamos la estadística de interés para cada muestra:
$$\hat{\theta}=s(\textbf{x})$$
la estimación puede ser la estimación _plug-in_ $t(P_n)$ pero también puede
ser otra.
3. La distribución de la estadística es la distribución bootstrap, y el
estimador bootstrap del error estándar es la desviación estándar de la
distribución bootstrap.
```{r, eval = FALSE}
dist_empirica <- tibble(id = 1:30, obs = samples$sims[[1]])
dist_empirica_plot <- ggplot(dist_empirica, aes(x = obs)) +
geom_histogram(binwidth = 2, alpha = 0.5, fill = "darkgray") +
geom_vline(aes(color = "mu", xintercept = 5), alpha = 0.5) +
geom_vline(aes(xintercept = samples$x_bar[1], color = "x_bar"),
alpha = 0.8, linetype = "dashed") +
xlim(-15, 20) +
geom_vline(xintercept = 5, color = "red", alpha = 0.5) +
labs(x = "", subtitle = expression("Distribución empírica"~P[n])) +
scale_colour_manual(values = c('mu' = 'red', 'x_bar' = 'blue'), name = '',
labels = c(expression(mu), expression(bar(x))))
samples_boot <- data_frame(sample_boot = 1:3) %>%
mutate(
sims_boot = rerun(3, sample(dist_empirica$obs, replace = TRUE)),
x_bar_boot = map_dbl(sims_boot, mean)
)
muestras_boot_plot <- samples_boot %>%
unnest() %>%
ggplot(aes(x = sims_boot)) +
geom_histogram(binwidth = 2, alpha = 0.5, fill = "darkgray") +
geom_vline(aes(xintercept = samples$x_bar[1]), color = "blue",
linetype = "dashed", alpha = 0.8) +
geom_vline(xintercept = 5, color = "red", alpha = 0.5) +
geom_segment(aes(x = x_bar_boot, xend = x_bar_boot, y = 0, yend = 0.8),
color = "black") +
xlim(-15, 20) +
facet_wrap(~ sample_boot) +
geom_text(aes(x = x_bar_boot, y = 0.95, label = "bar(x)^'*'"),
parse = TRUE, color = "black", alpha = 0.3, hjust = 1) +
labs(x = "", subtitle = "Muestras bootstrap")
boot_dist <- data_frame(sample = 1:10000) %>%
mutate(
sims_boot = rerun(10000, sample(dist_empirica$obs, replace = TRUE)),
mu_hat_star = map_dbl(sims_boot, mean))
boot_muestral_plot <- ggplot(boot_dist, aes(x = mu_hat_star)) +
geom_histogram(alpha = 0.5, fill = "darkgray") +
labs(x = "",
subtitle = expression("Distribución bootstrap de "~hat(mu)^'*')) +
geom_vline(xintercept = 5, color = "red", alpha = 0.5) +
geom_vline(aes(xintercept = samples$x_bar[1]), color = "blue",
linetype = "dashed", alpha = 0.8)
(dist_empirica_plot | plot_spacer()) / (muestras_boot_plot | boot_muestral_plot)
```
![](img/bootstrap_world.png)
Describamos la notación y conceptos:
<div class="caja">
Definimos una **muestra bootstrap** como una muestra aleatoria de tamaño $n$ que
se obtiene de la distribución empírica $P_n$ y la denotamos
$$\textbf{x}^* = (x_1^*,...,x_n^*).$$
</div>
La notación de estrella indica que $\textbf{x}^*$ no son los datos $\textbf{x}$
sino una versión de **remuestreo** de $\textbf{x}$.
Otra manera de frasearlo: Los datos bootsrtap $x_1^*,...,x_n^*$ son una muestra
aleatoria de tamaño $n$ seleccionada con reemplazo de la población de $n$
objetos $(x_1,...,x_n)$.
<div class="caja">
A cada muestra bootstrap $\textbf{x}^*$ le corresponde una replicación
$\hat{\theta}^*=s(\textbf{x}^*).$
</div>
el estimador bootstrap de $se_P(\hat{\theta})$ se define como:
$$se_{P_n}(\hat{\theta}^*)$$
en otras palabras, la estimación bootstrap de $se_P(\hat{\theta})$ es el error
estándar de $\hat{\theta}$ para conjuntos de datos de tamaño $n$ seleccionados
de manera aleatoria de $P_n$.
La fórmula $se_{P_n}(\hat{\theta}^*)$ no existe para casi ninguna estimación
diferente de la media, por lo que recurrimos a la técnica computacional
bootstrap:
<div class="caja">
**Algoritmo bootstrap para estimar errores estándar**
1. Selecciona $B$ muestras bootstrap independientes:
$$\textbf{x}^{*1},..., \textbf{x}^{*B}$$.
2. Evalúa la replicación bootstrap correspondiente a cada muestra bootstrap:
$$\hat{\theta}^{*b}=s(\textbf{x}^{*b})$$
para $b=1,2,...,B.$
3. Estima el error estándar $se_P(\hat{\theta})$ usando la desviación estándar
muestral de las $B$ replicaciones:
$$\hat{se}_B = \bigg\{\frac{\sum_{b=1}^B[\hat{\theta}^{*}(b)-\hat{\theta}^*(\cdot)]^2 }{B-1}\bigg\}^{1/2}$$
donde $$\hat{\theta}^*(\cdot)=\sum_{b=1}^B \theta^{*}(b)/B $$.
</p>
</div>
Notemos que:
* La estimación bootstrap de $se_{P}(\hat{\theta})$, el error estándar
de una estadística $\hat{\theta}$, es un estimador *plug-in* que usa la
función de distribución empírica $P_n$ en lugar de la distribución desconocida
$P$.
* Conforme el número de replicaciones $B$ aumenta
$$\hat{se}_B\approx se_{P_n}(\hat{\theta})$$
este hecho equivale a decir que la desviación estándar empírica se acerca a
la desviación estándar poblacional conforme crece el número de muestras. La
_población_ en este caso es la población de valores $\hat{\theta}^*=s(x^*)$.
* Al estimador de bootstrap ideal $se_{P_n}(\hat{\theta})$ y su aproximación
$\hat{se}_B$ se les denota **estimadores bootstrap no paramétricos** ya que
estan basados en $P_n$, el estimador no paramétrico de la población $P$.
#### Ejemplo: Error estándar bootstrap de una media {-}
```{r esp3_media_boot, cache=TRUE}
mediaBoot <- function(x){
# x: variable de interés
# n: número de replicaciones bootstrap
n <- length(x)
muestra_boot <- sample(x, size = n, replace = TRUE)
mean(muestra_boot) # replicacion bootstrap de theta_gorro
}
thetas_boot <- rerun(10000, mediaBoot(enlace_muestra$esp_3)) %>% flatten_dbl()
sd(thetas_boot)
```
y se compara con $\hat{se}(\bar{x})$ (estimador *plug-in* del error estándar):
```{r}
se <- function(x) sqrt(sum((x - mean(x)) ^ 2)) / length(x)
se(enlace_muestra$esp_3)
```
**Nota:** Conforme $B$ aumenta $\hat{se}_{B}(\bar{x})\to \{\sum_{i=1}^n(x_i - \bar{x})^2 / n \}^{1/2}$,
se demuestra con la ley débil de los grandes números.
![](img/manicule2.jpg) Considera el coeficiente de correlación muestral entre la
calificación de $y=$esp_3 y la de $z=$esp_6: $\hat{corr}(y,z)=0.9$. ¿Qué tan
precisa es esta estimación?
### Variación en distribuciones bootstrap {-}
En el proceso de estimación bootstrap hay dos fuentes de variación pues:
* La muestra original se selecciona con aleatoriedad de una población.
* Las muestras bootstrap se seleccionan con aleatoriedad de la muestra
original. Esto es: *La estimación bootstrap ideal es un resultado asintótico
$B=\infty$, en esta caso $\hat{se}_B$ iguala la estimación _plug-in_
$se_{P_n}$.*
En el proceso de *bootstrap* podemos controlar la variación del segundo aspecto,
conocida como **implementación de muestreo Monte Carlo**, y la variación
Monte Carlo decrece conforme incrementamos el número de muestras.
Podemos eliminar la variación Monte Carlo si seleccionamos todas las posibles
muestras con reemplazo de tamaño $n$, hay ${2n-1}\choose{n}$ posibles muestras
y si seleccionamos todas obtenemos $\hat{se}_\infty$ (bootstrap ideal), sin
embargo, en la mayor parte de los problemas no es factible proceder así.
```{r, eval = FALSE}
set.seed(8098)
pob_plot <- ggplot(data_frame(x = -15:20), aes(x)) +
stat_function(fun = dnormm, args = list(p = c(0.3, 0.7), mu = c(-2, 8),
sigma = c(3.5, 3)), alpha = 0.8) +
geom_vline(aes(color = "mu", xintercept = 5), alpha = 0.5) +
scale_colour_manual(values = c('mu' = 'red'), name = '',
labels = expression(mu)) +
labs(x = "", y = "", subtitle = "Población", color = "") +
theme(axis.text.y = element_blank())
samples <- data_frame(sample = 1:6) %>%
mutate(
sims = rerun(6, rnormm(50, p = c(0.3, 0.7), mu = c(-2, 8),
sigma = c(3.5, 3))),
x_bar = map_dbl(sims, mean))
means_boot <- function(n, sims) {
rerun(n, mean(sample(sims, replace = TRUE))) %>%
flatten_dbl()
}
samples_boot <- samples %>%
mutate(
medias_boot_30_1 = map(sims, ~means_boot(n = 30, .)),
medias_boot_30_2 = map(sims, ~means_boot(n = 30, .)),
medias_boot_1000_1 = map(sims, ~means_boot(n = 1000, .)),
medias_boot_1000_2 = map(sims, ~means_boot(n = 1000, .))
)
emp_dists <- samples_boot %>%
unnest(cols = sims) %>%
rename(obs = sims)
emp_dists_plots <- ggplot(emp_dists, aes(x = obs)) +
geom_histogram(binwidth = 2, alpha = 0.5, fill = "darkgray") +
geom_vline(aes(color = "mu", xintercept = 5), alpha = 0.5,
show.legend = FALSE) +
geom_vline(aes(xintercept = x_bar, color = "x_bar"), show.legend = FALSE,
alpha = 0.8, linetype = "dashed") +
xlim(-15, 20) +
geom_vline(xintercept = 5, color = "red", alpha = 0.5) +
labs(x = "", y = "", subtitle = expression("Distribución empírica"~P[n])) +
scale_colour_manual(values = c('mu' = 'red', 'x_bar' = 'blue'), name = '',
labels = c(expression(mu), expression(bar(x)))) +
facet_wrap(~ sample, ncol = 1) +
theme(strip.background = element_blank(), strip.text.x = element_blank(),
axis.text.y = element_blank())
boot_dists_30 <- samples_boot %>%
unnest(cols = c(medias_boot_30_1, medias_boot_30_2)) %>%
pivot_longer(cols = c(medias_boot_30_1, medias_boot_30_2),
values_to = "mu_hat_star", names_to = "boot_trial",
names_prefix = "medias_boot_30_")
boot_dists_30_plot <- ggplot(boot_dists_30, aes(x = mu_hat_star)) +
geom_histogram(alpha = 0.5, fill = "darkgray") +
labs(x = "", y = "",
subtitle = expression("Distribución bootstrap B = 30")) +
geom_vline(xintercept = 5, color = "red", alpha = 0.5) +
geom_vline(aes(xintercept = x_bar), color = "blue",
linetype = "dashed", alpha = 0.8) +
facet_grid(sample~boot_trial) +
theme(strip.background = element_blank(), strip.text.y = element_blank(),
axis.text.y = element_blank())
boot_dists_1000 <- samples_boot %>%
unnest(cols = c(medias_boot_1000_1, medias_boot_1000_2)) %>%
pivot_longer(cols = c(medias_boot_1000_1, medias_boot_1000_2),
values_to = "mu_hat_star", names_to = "boot_trial",
names_prefix = "medias_boot_1000_")
boot_dists_1000_plot <- ggplot(boot_dists_1000, aes(x = mu_hat_star)) +
geom_histogram(alpha = 0.5, fill = "darkgray") +
labs(subtitle = expression("Distribución bootstrap B = 1000"),
x = "", y = "") +
geom_vline(xintercept = 5, color = "red", alpha = 0.5) +
geom_vline(aes(xintercept = x_bar), color = "blue",
linetype = "dashed", alpha = 0.8) +
facet_grid(sample~boot_trial) +
scale_colour_manual(values = c('mu' = 'red', 'x_bar' = 'blue'), name = '',
labels = c(expression(mu), expression(bar(x)))) +
theme(strip.background = element_blank(), strip.text.y = element_blank(),
strip.text.x = element_blank(), axis.text.y = element_blank())
(pob_plot | plot_spacer() | plot_spacer()) /
(emp_dists_plots | boot_dists_30_plot | boot_dists_1000_plot) +
plot_layout(heights = c(1, 5))
```
En la siguiente gráfica mostramos 6 posibles muestras de tamaño 50 simuladas de
la población, para cada una de ellas se graficó la distribución empírica y se
se realizan histogramas de la distribución bootstrap con $B=30$ y $B=1000$, en
cada caso hacemos dos repeticiones, notemos que cuando el número de muestras
bootstrap es grande las distribuciones bootstrap son muy similares (para una
muestra de la población dada), esto es porque disminuimos el erro Monte Carlo.
También vale la pena recalcar que la distribución bootstrap está centrada en el
valor observado en la muestra (línea azúl punteada) y no en el valor poblacional
sin embargo la forma de la distribución es similar a lo largo de las filas.
![](img/bootstrap_mc_error.png)
<!--
* En la práctica para elegir el tamaño de $B$ debemos considerar que buscamos
las mismas propiedades para la estimación de un error estándar que para
cualquier estimación: poco sesgo y desviación estándar chica. El sesgo de la
estifmación bootstrap del error estándar suele ser bajo y el error estándar está
Una respuesta aproximada es en términos del coeficiente de variación de
$\hat{se}_B$, esto es el cociente de la desviación estándar de $\hat{se}_B$ y su
valor esperado, la variabilidad adicional de parar en $B$ replicaciones en lugar
de seguir hasta infiniti se refleja en un incremento en el coeficiente de
variación
-->
Entonces, ¿cuántas muestras bootstrap?
1. Incluso un número chico de replicaciones bootstrap, digamos $B=25$ es
informativo, y $B=50$ con frecuencia es suficiente para dar una buena
estimación de $se_P(\hat{\theta})$ (@efron).
2. Cuando se busca estimar error estándar @tim recomienda $B=1000$ muestras, o
$B=10,000$ muestras dependiendo la presición que se busque.
```{r}
seMediaBoot <- function(x, B){
thetas_boot <- rerun(B, mediaBoot(x)) %>% flatten_dbl()
sd(thetas_boot)
}
B_muestras <- data_frame(n_sims = c(5, 25, 50, 100, 200, 400, 1000, 1500, 3000,
5000, 10000, 20000)) %>%
mutate(est = map_dbl(n_sims, ~seMediaBoot(x = enlace_muestra$esp_3, B = .)))
B_muestras
```
#### Ejemplo componentes principales: calificaciones en exámenes {-}
Los datos _marks_ (Mardia, Kent y Bibby, 1979) contienen los puntajes de 88
estudiantes en 5 pruebas: mecánica, vectores, álgebra, análisis y estadística.
Cada renglón corresponde a la calificación de un estudiante en cada prueba.
```{r leer_marks}
data(marks, package = "ggm")
glimpse(marks)
```
Entonces un análisis de componentes principales proseguiría como sigue:
```{r pc, fig.height=3, fig.width=3}
pc_marks <- princomp(marks)
summary(pc_marks)
loadings(pc_marks)
plot(pc_marks, type = "lines")
```
```{r}
biplot(pc_marks)
```
Los cálculos de un análisis de componentes principales involucran la matriz de
covarianzas empírica $G$ (estimaciones _plug-in_)
$$G_{jk} = \frac{1}{88}\sum_{i=1}^88(x_{ij}-\bar{x_j})(x_{ik}-\bar{x_k})$$
para $j,k=1,2,3,4,5$, y donde $\bar{x_j} = \sum_{i=1}^88 x_{ij} / 88$ (la media
de la i-ésima columna).
```{r}
G <- cov(marks) * 87 / 88
G
```
Los _pesos_ y las _componentes principales_ no son mas que los eigenvalores y
eigenvectores de la matriz de covarianzas $G$, estos se calculan a través de una
serie de de manipulaciones algebraicas que requieren cálculos del orden de p^3^
(cuando G es una matriz de tamaño p$\times$p).
```{r}
eigen_G <- eigen(G)
lambda <- eigen_G$values
v <- eigen_G$vectors
lambda
v
```
1. Proponemos el siguiente modelo simple para puntajes correlacionados:
$$\textbf{x}_i = Q_i \textbf{v}$$
donde $\textbf{x}_i$ es la tupla de calificaciones del i-ésimo estudiante,
$Q_i$ es un número que representa la habilidad del estudiante y $\textbf{v}$ es
un vector fijo con 5 números que aplica a todos los estudiantes. Si este modelo
simple fuera cierto, entonces únicamente el $\hat{\lambda}_1$ sería positivo
y $\textbf{v} = \hat{v}_1$.
Sea $$\hat{\theta}=\sum_{i=1}^5\hat{\lambda}_i$$
el modelo propuesto es equivalente a $\hat{\theta}=1$, inculso si el modelo es
correcto, no esperamos que $\hat{\theta}$ sea exactamente uno pues hay ruido en
los datos.
```{r}
theta_hat <- lambda[1]/sum(lambda)
theta_hat
```
El valor de $\hat{\theta}$ mide el porcentaje de la varianza explicada en la
primer componente principal, ¿qué tan preciso es $\hat{\theta}$? La complejidad
matemática en el cálculo de $\hat{\theta}$ es irrelevante siempre y cuando
podamos calcular $\hat{\theta}^*$ para una muestra bootstrap, en esta caso una
muestra bootsrtap es una base de datos de 88 $\times$ 5 $\textbf{X}^*$, donde las
filas $\bf{x_i}^*$ de $\textbf{X}^*$ son una muestra aleatoria de tamaño
88 de la verdadera matriz de datos.
```{r}
pc_boot <- function(){
muestra_boot <- sample_n(marks, size = 88, replace = TRUE)
G <- cov(muestra_boot) * 87 / 88
eigen_G <- eigen(G)
theta_hat <- eigen_G$values[1] / sum(eigen_G$values)
}
B <- 1000
thetas_boot <- rerun(B, pc_boot()) %>% flatten_dbl()
```
Veamos un histograma de las replicaciones de $\hat{\theta}$:
```{r pc_hist, fig.height=4, fig.width=4, out.width="300px"}
ggplot(data_frame(theta = thetas_boot)) +
geom_histogram(aes(x = theta, y = ..density..), binwidth = 0.02,
fill = "gray40") +
geom_vline(aes(xintercept = mean(theta)), color = "red") +
labs(x = expression(hat(theta)^"*"), y = "")
```
Estas tienen un error estándar
```{r}
theta_se <- sd(thetas_boot)
theta_se
```