14.3 Estimaciones experimentales del efecto de las reducciones del tamaño de las clases

Diseño experimental y conjunto de datos

El Proyecto Student-Teacher Achievement Ratio (STAR) fue un gran experimento controlado aleatorio con el objetivo de afirmar si una reducción del tamaño de la clase es efectiva para mejorar los resultados educativos. Se llevó a cabo en 80 escuelas primarias de Tennessee durante un período de cuatro años durante la década de 1980 por el Departamento de Educación del Estado en EE. UU.

En el primer año, alrededor de 6400 estudiantes fueron asignados aleatoriamente a una de tres intervenciones: Clase pequeña (13 a 17 estudiantes por maestro), clase regular (22 a 25 estudiantes por maestro) y clase regular con ayudante (22 a 25 estudiantes por maestro y estudiantes con un asistente de maestro de tiempo completo). Los maestros también fueron asignados al azar a las clases que impartían. Las intervenciones se iniciaron cuando los estudiantes ingresaron a la escuela en el jardín de infantes y continuaron hasta el tercer grado. Los grupos de control y tratamiento en todos los grados se resumen en la Tabla 14.1.

Table 14.1: Grupos de control y tratamiento en el experimento STAR
K 1 2 3
Tratamiento 1 Clase pequeña Clase pequeña Clase pequeña Clase pequeña
Tratamiento 2 Clase regular + Ayudante Clase regular + Ayudante Clase regular + Ayudante Clase regular + Ayudante
Control Clase regular Clase regular Clase regular Clase regular

Cada año, el progreso de aprendizaje de los estudiantes se evaluó mediante la suma de los puntos obtenidos en las partes de matemáticas y lectura de una prueba estandarizada (la Prueba de rendimiento de Stanford).

El conjunto de datos STAR es parte del paquete AER.

# cargar el paquete AER y el conjunto de datos STAR
library(AER)
data(STAR)

head(STAR) muestra que existe una variedad de variables de factores que describen las características de los estudiantes y maestros, así como varios indicadores de la escuela, todos los cuales se registran por separado para los cuatro grados diferentes. Los datos están en formato ancho; es decir, cada variable tiene su propia columna y, para cada alumno, las filas contienen observaciones sobre estas variables. Usando dim(STAR) se encontró que existe un total de 11598 observaciones en 47 variables.

# obtener una descripción general
head(STAR, 2)
#>      gender ethnicity   birth stark star1 star2   star3 readk read1 read2 read3
#> 1122 female      afam 1979 Q3  <NA>  <NA>  <NA> regular    NA    NA    NA   580
#> 1137 female      cauc 1980 Q1 small small small   small   447   507   568   587
#>      mathk math1 math2 math3   lunchk lunch1   lunch2 lunch3 schoolk school1
#> 1122    NA    NA    NA   564     <NA>   <NA>     <NA>   free    <NA>    <NA>
#> 1137   473   538   579   593 non-free   free non-free   free   rural   rural
#>      school2  school3  degreek  degree1  degree2  degree3 ladderk ladder1
#> 1122    <NA> suburban     <NA>     <NA>     <NA> bachelor    <NA>    <NA>
#> 1137   rural    rural bachelor bachelor bachelor bachelor  level1  level1
#>         ladder2    ladder3 experiencek experience1 experience2 experience3
#> 1122       <NA>     level1          NA          NA          NA          30
#> 1137 apprentice apprentice           7           7           3           1
#>      tethnicityk tethnicity1 tethnicity2 tethnicity3 systemk system1 system2
#> 1122        <NA>        <NA>        <NA>        cauc    <NA>    <NA>    <NA>
#> 1137        cauc        cauc        cauc        cauc      30      30      30
#>      system3 schoolidk schoolid1 schoolid2 schoolid3
#> 1122      22      <NA>      <NA>      <NA>        54
#> 1137      30        63        63        63        63
dim(STAR)
#> [1] 11598    47
# obtener los nombres de las variables
names(STAR)
#>  [1] "gender"      "ethnicity"   "birth"       "stark"       "star1"      
#>  [6] "star2"       "star3"       "readk"       "read1"       "read2"      
#> [11] "read3"       "mathk"       "math1"       "math2"       "math3"      
#> [16] "lunchk"      "lunch1"      "lunch2"      "lunch3"      "schoolk"    
#> [21] "school1"     "school2"     "school3"     "degreek"     "degree1"    
#> [26] "degree2"     "degree3"     "ladderk"     "ladder1"     "ladder2"    
#> [31] "ladder3"     "experiencek" "experience1" "experience2" "experience3"
#> [36] "tethnicityk" "tethnicity1" "tethnicity2" "tethnicity3" "systemk"    
#> [41] "system1"     "system2"     "system3"     "schoolidk"   "schoolid1"  
#> [46] "schoolid2"   "schoolid3"

La mayoría de los nombres de las variables contienen un sufijo (k, 1, 2 o 3) que indica el grado al que se refiere la variable respectiva. Esto facilita el análisis de regresión porque permite ajustar el argumento formula en lm() para cada grado simplemente cambiando los sufijos de las variables de acuerdo con el objetivo.

El resultado producido por head() muestra que algunos valores registrados son NA y ; es decir, no existen datos sobre esta variable para el alumno en consideración. Esto radica en la naturaleza de los datos; por ejemplo, al tomar la primera observación “STAR[1,]”.

En la salida de head(STAR, 2) se encontró que el estudiante ingresó al experimento en tercer grado en una clase regular, por lo que el tamaño de la clase se registra en star3 y las otras variables indicadoras del tipo de clase son . Por la misma razón, no existen registros de su puntaje en matemáticas y lectura, excepto para el tercer grado. Es sencillo obtener un conjunto de datos que no contenga todos los NA / : Simplemente se necesitan pedir los NA usando !is.na().

# pedir los datos de NA para la primera observación e imprimir los resultados en la consola
STAR[1, !is.na(STAR[1, ])]
#>      gender ethnicity   birth   star3 read3 math3 lunch3  school3  degree3
#> 1122 female      afam 1979 Q3 regular   580   564   free suburban bachelor
#>      ladder3 experience3 tethnicity3 system3 schoolid3
#> 1122  level1          30        cauc      22        54

is.na(STAR[1, ]) devuelve un vector lógico con TRUE en posiciones que corresponden a entradas para la primera observación. El operador ! se usa para invertir el resultado de modo que se obtengan solo entradas que no sean para las primeras observaciones.

En general, no es necesario eliminar filas con datos faltantes porque lm() lo hace de forma predeterminada. La falta de datos puede implicar un tamaño de muestra pequeño y, por lo tanto, puede conducir a una estimación imprecisa y a una inferencia incorrecta. Sin embargo, esto no es un problema para el estudio en cuestión ya que, como se vera a continuación, los tamaños de muestra superan las 5000 observaciones para cada regresión realizada.

Análisis de los datos STAR

Como se puede ver en la Tabla 14.1, existen dos grupos de tratamiento en cada grado, clases pequeñas con solo 13 a 17 estudiantes y clases regulares con 22 a 25 estudiantes y un ayudante de enseñanza. Por lo tanto, se introducen dos variables binarias, cada una de las cuales es un indicador para el grupo de tratamiento respectivo, con el objetivo de que el estimador de diferencias capture el efecto del tratamiento para cada grupo de tratamiento por separado. Esto produce el modelo de regresión poblacional:

\[\begin{align} Y_i = \beta_0 + \beta_1 SmallClass_i + \beta_2 RegAide_i + u_i, \tag{14.3} \end{align}\]

con puntaje de prueba \(Y_i\), el indicador de clase pequeña \(SmallClass_i\) y \(RegAide_i\), el indicador de una clase regular con ayudante.

Se reproducen los resultados presentados en la Tabla 13.1 realizando la regresión (14.3) para cada grado por separado. En el caso de cada estudiante, la variable dependiente es simplemente la suma de los puntos obtenidos en las partes de matemáticas y lectura, construida usando I().

# calcular estimaciones de diferencias para cada grado
fmk <- lm(I(readk + mathk) ~ stark, data = STAR)
fm1 <- lm(I(read1 + math1) ~ star1, data = STAR)
fm2 <- lm(I(read2 + math2) ~ star2, data = STAR)
fm3 <- lm(I(read3 + math3) ~ star3, data = STAR)
# obtener una matriz de coeficientes utilizando errores estándar robustos
coeftest(fmk, vcov = vcovHC, type= "HC1")
#> 
#> t test of coefficients:
#> 
#>                    Estimate Std. Error  t value  Pr(>|t|)    
#> (Intercept)       918.04289    1.63339 562.0473 < 2.2e-16 ***
#> starksmall         13.89899    2.45409   5.6636 1.554e-08 ***
#> starkregular+aide   0.31394    2.27098   0.1382    0.8901    
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
coeftest(fm1, vcov = vcovHC, type= "HC1")
#> 
#> t test of coefficients:
#> 
#>                    Estimate Std. Error  t value  Pr(>|t|)    
#> (Intercept)       1039.3926     1.7846 582.4321 < 2.2e-16 ***
#> star1small          29.7808     2.8311  10.5190 < 2.2e-16 ***
#> star1regular+aide   11.9587     2.6520   4.5093  6.62e-06 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
coeftest(fm2, vcov = vcovHC, type= "HC1")
#> 
#> t test of coefficients:
#> 
#>                    Estimate Std. Error  t value  Pr(>|t|)    
#> (Intercept)       1157.8066     1.8151 637.8820 < 2.2e-16 ***
#> star2small          19.3944     2.7117   7.1522  9.55e-13 ***
#> star2regular+aide    3.4791     2.5447   1.3672    0.1716    
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
coeftest(fm3, vcov = vcovHC, type= "HC1")
#> 
#> t test of coefficients:
#> 
#>                     Estimate Std. Error  t value  Pr(>|t|)    
#> (Intercept)       1228.50636    1.68001 731.2483 < 2.2e-16 ***
#> star3small          15.58660    2.39604   6.5051 8.393e-11 ***
#> star3regular+aide   -0.29094    2.27271  -0.1280    0.8981    
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Se recopilan los resultados y se presentan en una tabla usando stargazer().

# calcular errores estándar robustos para cada modelo y reunirlos en una lista
rob_se_1 <- list(sqrt(diag(vcovHC(fmk, type = "HC1"))),
                 sqrt(diag(vcovHC(fm1, type = "HC1"))),
                 sqrt(diag(vcovHC(fm2, type = "HC1"))),
                 sqrt(diag(vcovHC(fm2, type = "HC1"))))
library(stargazer)

stargazer(fmk,fm1,fm2,fm3,
  title = "Proyecto STAR: Estimaciones de diferencias",
  header = FALSE, 
  type = "latex",
  model.numbers = F,
  omit.table.layout = "n",
  digits = 3, 
  column.labels = c("K", "1", "2", "3"),
  dep.var.caption  = "Variable dependiente: Grado",
  dep.var.labels.include = FALSE,
  se = rob_se_1)
Variable dependiente: Grado
K123
starksmall13.90***
(2.45)
starkregular+aide0.31
(2.27)
star1small29.78***
(2.83)
star1regular+aide11.96***
(2.65)
star2small19.39***
(2.71)
star2regular+aide3.48
(2.54)
star3small15.59
star3regular+aide-0.29
Constant918.04***1,039.39***1,157.81***1,228.51***
(1.63)(1.78)(1.82)(1.82)
Observations5,7866,3796,0495,967
R20.010.020.010.01
Adjusted R20.010.020.010.01
Residual Std. Error73.49 (df = 5783)90.50 (df = 6376)83.69 (df = 6046)72.91 (df = 5964)
F Statistic21.26*** (df = 2; 5783)56.34*** (df = 2; 6376)28.71*** (df = 2; 6046)30.25*** (df = 2; 5964)

Table 14.2: Proyecto STAR - Estimaciones de diferencias

Las estimaciones presentadas en la Tabla 14.2 sugieren que la reducción del tamaño de la clase mejora el rendimiento de los estudiantes. A excepción del grado 1, las estimaciones del coeficiente en \(SmallClass\) son aproximadamente de la misma magnitud (las estimaciones se encuentran entre 13.90 y 19.39 puntos) y son estadísticamente significativas a \(1\%\). Además, un ayudante de enseñanza tiene poco efecto, posiblemente nulo, en el desempeño de los estudiantes.

Se aumenta el modelo de regresión (14.3) a partir de diferentes conjuntos de regresores por dos razones:

  1. Si los regresores adicionales explican parte de la variación observada en la variable dependiente, se obtienen estimaciones más eficientes de los coeficientes de interés.
  2. Si el tratamiento no se recibe al azar debido a fallas en el seguimiento del protocolo de tratamiento, las estimaciones obtenidas usando (14.3) pueden estar sesgadas. Agregar regresores adicionales puede resolver o mitigar este problema.

En particular, se consideran las siguientes características de estudiantes y profesores:

  • \(experience\) — Años de experiencia del maestro.
  • \(boy\) — El estudiante es un niño (ficticia).
  • \(lunch\) — Elegibilidad para almuerzo gratis (ficticia).
  • \(black\) — El estudiante es afroamericano (ficticia).
  • \(race\) — La raza del estudiante no es blanca ni negra (ficticia).
  • \(\text{schoolid}\) — Variables indicadoras de la escuela.

en las cuatro especificaciones de regresión poblacional

\[\begin{align} Y_i =& \beta_0 + \beta_1 SmallClass_i + \beta_2 RegAide_i + u_i, \tag{14.4} \\ Y_i =& \beta_0 + \beta_1 SmallClass_i + \beta_2 RegAide_i + \beta_3 experience_i + u_i, \tag{14.5} \\ Y_i =& \beta_0 + \beta_1 SmallClass_i + \beta_2 RegAide_i + \beta_3 experience_i + schoolid + u_i, \tag{14.6} \end{align}\]

y

\[\begin{align} Y_i =& \beta_0 + \beta_1 SmallClass_i + \beta_2 RegAide_i + \beta_3 experience_i + \beta_4 boy + \beta_5 lunch \\ & + \beta_6 black + \beta_7 race + schoolid + u_i. \tag{14.7} \end{align}\]

Antes de la estimación, se crean algunos subconjuntos y ordenan los datos utilizando funciones de los paquetes dplyr y tidyr. Ambos son parte de tidyverse, una colección de paquetes R diseñados para la ciencia de datos y el manejo de grandes conjuntos de datos (consulte el sitio oficial para obtener más información sobre los paquetes de tidyverse). Las funciones %>%, transmute() y mutate() son suficientes para nosotros aquí:

  • %>% permite encadenar llamadas a funciones.
  • transmute() permite subdividir el conjunto de datos nombrando las variables que se van a mantener.
  • mutate() es conveniente para agregar nuevas variables basadas en las existentes conservando estas últimas.

Los modelos de regresión (14.4) a (14.7) requieren las variables gender, ethnicity, stark, readk, mathk, lunchk, experiencek y schoolidk. Después de eliminar las variables restantes usando transmute(), se usa mutate() para agregar tres variables binarias adicionales que son derivadas de las existentes: black, race y boy. Se generan usando declaraciones lógicas dentro de la función ifelse().

# cargar los paquetes 'dplyr' y 'tidyr' para las funcionalidades de gestión de datos
library(dplyr)
library(tidyr)

# generar subconjunto con datos de jardín de infantes
STARK <- STAR %>% 
      transmute(gender,
                ethnicity,
                stark,
                readk,
                mathk,
                lunchk,
                experiencek,
                schoolidk) %>% 
      mutate(black = ifelse(ethnicity == "afam", 1, 0),
             race = ifelse(ethnicity == "afam" | ethnicity == "cauc", 1, 0),
             boy = ifelse(gender == "male", 1, 0))
# estimar los modelos
gradeK1 <- lm(I(mathk + readk) ~ stark + experiencek, 
              data = STARK)

gradeK2 <- lm(I(mathk + readk) ~ stark + experiencek + schoolidk, 
              data = STARK)

gradeK3 <- lm(I(mathk + readk) ~ stark + experiencek + boy + lunchk 
              + black + race + schoolidk, 
              data = STARK)

En aras de la brevedad, se excluyen los coeficientes de las variables ficticias del indicador en la salida de coeftest() subconjuntando las matrices.

# obtener una inferencia robusta sobre la significancia de los coeficientes
coeftest(gradeK1, vcov. = vcovHC, type = "HC1")
#> 
#> t test of coefficients:
#> 
#>                    Estimate Std. Error  t value  Pr(>|t|)    
#> (Intercept)       904.72124    2.22235 407.1020 < 2.2e-16 ***
#> starksmall         14.00613    2.44704   5.7237 1.095e-08 ***
#> starkregular+aide  -0.60058    2.25430  -0.2664    0.7899    
#> experiencek         1.46903    0.16929   8.6778 < 2.2e-16 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
coeftest(gradeK2, vcov. = vcovHC, type = "HC1")[1:4, ]
#>                      Estimate Std. Error     t value     Pr(>|t|)
#> (Intercept)       925.6748750  7.6527218 120.9602155 0.000000e+00
#> starksmall         15.9330822  2.2411750   7.1092540 1.310324e-12
#> starkregular+aide   1.2151960  2.0353415   0.5970477 5.504993e-01
#> experiencek         0.7431059  0.1697619   4.3773429 1.222880e-05
coeftest(gradeK3, vcov. = vcovHC, type = "HC1")[1:7, ]
#>                      Estimate Std. Error     t value     Pr(>|t|)
#> (Intercept)       937.6831330 14.3726687  65.2407117 0.000000e+00
#> starksmall         15.8900507  2.1551817   7.3729516 1.908960e-13
#> starkregular+aide   1.7869378  1.9614592   0.9110247 3.623211e-01
#> experiencek         0.6627251  0.1659298   3.9940097 6.578846e-05
#> boy               -12.0905123  1.6726331  -7.2284306 5.533119e-13
#> lunchkfree        -34.7033021  1.9870366 -17.4648529 1.437931e-66
#> black             -25.4305130  3.4986918  -7.2685776 4.125252e-13

Ahora se usa stargazer() para recopilar toda la información relevante en una tabla estructurada.

# calcular errores estándar robustos para cada modelo y reunirlos en una lista
rob_se_2 <- list(sqrt(diag(vcovHC(fmk, type = "HC1"))),
                 sqrt(diag(vcovHC(gradeK1, type = "HC1"))),
                 sqrt(diag(vcovHC(gradeK2, type = "HC1"))),
                 sqrt(diag(vcovHC(gradeK3, type = "HC1"))))
stargazer(fmk, fm1, fm2, fm3,
  title = "Proyecto STAR - Estimación de diferencias con regresores adicionales para jardín de infantes",
  header = FALSE, 
  type = "latex",
  model.numbers = F,
  omit.table.layout = "n",
  digits = 3, 
  column.labels = c("(1)", "(2)", "(3)", "(4)"),
  dep.var.caption  = "Variable dependiente: Puntaje de la prueba en el jardín de infantes",
  dep.var.labels.include = FALSE,
  se = rob_se_2) 
Variable dependiente: Puntaje de la prueba en el jardín de infantes
(1)(2)(3)(4)
starksmall13.899***14.006***15.933***15.890***
(2.454)(2.447)(2.241)(2.155)
starkregular+aide0.314-0.6011.2151.787
(2.271)(2.254)(2.035)(1.961)
experiencek1.469***0.743***0.663***
(0.169)(0.170)(0.166)
boy-12.091***
(1.673)
lunchkfree-34.703***
(1.987)
black-25.431***
(3.499)
race8.501
(12.520)
Constant918.043***904.721***925.675***937.683***
(1.633)(2.222)(7.653)(14.373)
School indicators?nonoyesyes
Observations5,7865,7665,7665,748
R20.0070.0200.2340.291
Adjusted R20.0070.0200.2230.281
Residual Std. Error73.490 (df = 5783)73.085 (df = 5762)65.075 (df = 5684)62.663 (df = 5662)
F Statistic21.263*** (df = 2; 5783)39.861*** (df = 3; 5762)21.413*** (df = 81; 5684)27.364*** (df = 85; 5662)

Table 14.3: Proyecto STAR - Estimación de diferencias con regresores adicionales para jardín de infantes

Los resultados en la columna (1) de la Tabla 14.3 simplemente repiten los resultados obtenidos para (14.3). Las columnas (2) a (4) revelan que la suma de las características de los estudiantes y los efectos fijos de la escuela no conducen a estimaciones sustancialmente diferentes de los efectos del tratamiento. Este resultado hace que sea más plausible que las estimaciones de los efectos obtenidos utilizando el modelo (14.3) no adolezcan de fallas en la asignación aleatoria. Existe una disminución en los errores estándar y un aumento en \(\bar{R}^2\), lo que implica que las estimaciones son más precisas.

Debido a que los maestros fueron asignados aleatoriamente en las clases, la inclusión del efecto fijo de la escuela nos permite estimar el efecto causal de la experiencia de un maestro en los puntajes de las pruebas de los estudiantes de jardín de infantes. La regresión (3) predice que el efecto promedio de 10 años de experiencia en los puntajes de las pruebas será de \(10\cdot 0.74=7.4\) puntos. Se debe tener en cuenta que las otras estimaciones sobre las características de los estudiantes en la regresión (4) no tienen una interpretación causal debido a una asignación no aleatoria.

¿Los efectos estimados presentados en la Tabla 14.3 son grandes o pequeños en un sentido práctico? Traduciendo los cambios predichos en los puntajes de las pruebas a unidades de desviación estándar para permitir una comparación (consulte la Sección 10.4 para obtener un argumento similar).

# calcular las desviaciones estándar de la muestra de los puntajes de las pruebas
SSD <- c("K" = sd(na.omit(STAR$readk + STAR$mathk)),
         "1" = sd(na.omit(STAR$read1 + STAR$math1)),
         "2" = sd(na.omit(STAR$read2 + STAR$math2)),
         "3" = sd(na.omit(STAR$read3 + STAR$math3)))

# traducir los efectos de clases pequeñas a desviaciones estándar
Small <- c("K" = as.numeric(coef(fmk)[2]/SSD[1]),
           "1" = as.numeric(coef(fm1)[2]/SSD[2]),
           "2" = as.numeric(coef(fm2)[2]/SSD[3]),
           "3" = as.numeric(coef(fm3)[2]/SSD[4]))

# ajustar los errores estándar
SmallSE <- c("K" = as.numeric(rob_se_1[[1]][2]/SSD[1]),
             "1" = as.numeric(rob_se_1[[2]][2]/SSD[2]),
             "2" = as.numeric(rob_se_1[[3]][2]/SSD[3]),
             "3" = as.numeric(rob_se_1[[4]][2]/SSD[4]))

# traducir los efectos de las clases regulares con ayuda a las desviaciones estándar
RegAide<- c("K" = as.numeric(coef(fmk)[3]/SSD[1]),
            "1" = as.numeric(coef(fm1)[3]/SSD[2]),
            "2" = as.numeric(coef(fm2)[3]/SSD[3]),
            "3" = as.numeric(coef(fm3)[3]/SSD[4]))

# ajustar los errores estándar
RegAideSE <- c("K" = as.numeric(rob_se_1[[1]][3]/SSD[1]),
               "1" = as.numeric(rob_se_1[[2]][3]/SSD[2]),
               "2" = as.numeric(rob_se_1[[3]][3]/SSD[3]),
               "3" = as.numeric(rob_se_1[[4]][3]/SSD[4]))

# recopilar los resultados en un data.frame y redondear
df <- t(round(data.frame(
                        Small, SmallSE, RegAide, RegAideSE, SSD),
                        digits =  2))

Es bastante fácil convertir data.frame o df en una tabla.

# generar una tabla simple usando Stargazer
stargazer(df,
          title = "Efectos estimados del tamaño de la clase (en unidades de desviaciones estándar)",
          type = "html", 
          summary = FALSE,
          header = FALSE
          )
K123
Small0.1900.3300.2300.210
SmallSE0.0300.0300.0300.040
RegAide00.1300.0400
RegAideSE0.0300.0300.0300.030
SSD73.75091.28084.08073.270

Table 14.4: Efectos estimados del tamaño de la clase (en unidades de desviaciones estándar)

El efecto estimado de clases pequeñas es mayor para el primer grado. Lo anterior probablemente se deba a que los estudiantes del grupo de control del primer grado obtuvieron malos resultados en la prueba por alguna razón desconocida o simplemente debido a una variación aleatoria. La diferencia entre el efecto estimado de estar en una clase pequeña y estar en clases regulares con un asistente es aproximadamente 0.2 desviaciones estándar para todos los grados. Esto lleva a la conclusión de que el efecto de estar en una clase de tamaño regular con un asistente es cero y el efecto de estar en una clase pequeña es aproximadamente el mismo para todos los grados.

Hasta qué punto estas estimaciones experimentales son comparables con las estimaciones observacionales obtenidas utilizando datos sobre distritos escolares en California y Massachusetts en el Capítulo 10. Resulta que, de hecho, las estimaciones son muy similares. Consulte la sección mencionada anteriormente en el libro para obtener una discusión más detallada.