Las variables cualitativas se representan en R con factores. En este caso hay dos variables cualitativas, mom_hs y mom_work. Como no son factores, se van a convertir a factor:
d = read.csv("datos/kidiq.csv")
str(d)
## 'data.frame': 434 obs. of 5 variables:
## $ kid_score: int 65 98 85 83 115 98 69 106 102 95 ...
## $ mom_hs : int 1 1 1 1 1 0 1 1 1 1 ...
## $ mom_iq : num 121.1 89.4 115.4 99.4 92.7 ...
## $ mom_work : int 4 4 4 3 4 1 4 3 1 1 ...
## $ mom_age : int 27 25 27 25 27 18 20 23 24 19 ...
d$mom_hs = factor(d$mom_hs, labels = c("no", "si"))
d$mom_work = factor(d$mom_work, labels = c("notrabaja", "trabaja23", "trabaja1_parcial", "trabaja1_completo"))
La primera opción para incluir regresores cualitativos en el modelo es crear variables auxiliares con valores cero - uno. En este caso se crea la variable auxiliar secundaria_si:
secundaria_si = ifelse(d$mom_hs == "si", 1, 0)
El modelo estadístico que vamos a estimar es:
\[ kid\_score_i = \beta_0 + \beta_1 secundaria\_si_i + e_i \]
m = lm(kid_score ~ secundaria_si, data = d)
coef(m)
## (Intercept) secundaria_si
## 77.54839 11.77126
El el fondo tenemos dos modelos, uno para las madres que han terminado secundaria y otro para los que no han terminado:
\[ kid\_score_i = \beta_0 + e_i, \quad i \in 1,2,\cdots,n_0 \]
donde \(n_0\) es el numero de madres sin secundaria. Si sumamos en ambos lados del modelo se tiene:
\[ \sum_{i=1}^{n_0} kid\_score_i = \sum_{i=1}^{n_0} \beta_0 + \sum_{i=1}^{n_0} e_i = n_0 \beta_0 \Rightarrow \beta_0 = \frac{\sum_{i=1}^{n_0} kid\_score_i}{n_0} \]
Es decir, que \(\beta_0\) representa la puntuación media de los chicos cuya madre no ha terminado secundaria, 77.5483871
mean(d$kid_score[d$mom_hs == "no"])
## [1] 77.54839
\[ kid\_score_i = \beta_0 + \beta_1 + e_i, \quad i \in 1,2,\cdots,n_1 \]
donde \(n_1\) es el numero de madres con secundaria. Si sumamos en ambos lados del modelo se tiene:
\[ \sum_{i=1}^{n_1} kid\_score_i = \sum_{i=1}^{n_1} (\beta_0 + \beta_1 + e_i) = n_1 (\beta_0 + \beta_1) \Rightarrow \beta_0 + \beta_1 = \frac{\sum_{i=1}^{n_1} kid\_score_i}{n_1} \]
Es decir, que \(\beta_0 + \beta_1\) representa la puntuación media de los chicos cuya madre ha terminado secundaria, 89.3196481. Por tanto, \(\beta_1\) representa la diferencia entre las puntuaciones medias.
mean(d$kid_score[d$mom_hs == "si"])
## [1] 89.31965
Una manera más elegante de estimar estos modelos en R es utilizar directamente los factores en la formula de lm():
m = lm(kid_score ~ mom_hs, data = d)
summary(m)
##
## Call:
## lm(formula = kid_score ~ mom_hs, data = d)
##
## Residuals:
## Min 1Q Median 3Q Max
## -57.55 -13.32 2.68 14.68 58.45
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 77.548 2.059 37.670 < 2e-16 ***
## mom_hssi 11.771 2.322 5.069 5.96e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 19.85 on 432 degrees of freedom
## Multiple R-squared: 0.05613, Adjusted R-squared: 0.05394
## F-statistic: 25.69 on 1 and 432 DF, p-value: 5.957e-07
Internamente, R ha creado la variable auxiliar mom_hssi, que toma los valores
R asigna los valores 0 y 1 en función de los niveles del factor:
levels(d$mom_hs)
## [1] "no" "si"
contrasts(d$mom_hs)
## si
## no 0
## si 1
También se podía haber creado la variable auxiliar secundaria_no:
secundaria_no = ifelse(d$mom_hs == "no", 1, 0)
El modelo estadístico que vamos a estimar ahora es:
\[ kid\_score_i = \beta_0 + \beta_1 secundaria\_no_i + e_i \]
m = lm(kid_score ~ secundaria_no, data = d)
coef(m)
## (Intercept) secundaria_no
## 89.31965 -11.77126
Los dos modelos que tenemos ahora son:
\[ kid\_score_i = \beta_0 + e_i \]
Razonando igual que antes tenemos que \(\beta_0\) representa la puntuación media de los chicos cuya madre ha terminado secundaria, 89.3196481. Como vemos el valor coincide con lo obtenido antes.
\[ kid\_score_i = \beta_0 + \beta_1 + e_i \]
Por tanto, \(\beta_0 + \beta_1\) representa la puntuación media de los chicos cuya madre no ha terminado secundaria. Sumando se obtiene
coef(m)[1] + coef(m)[2]
## (Intercept)
## 77.54839
En este caso, \(\beta_1\) sigue representando la diferencia entre las puntuaciones medias.
Este nuevo modelo se introduce en lm() cambiando el nivel de referencia de la variable factor. Los niveles que tiene actualmente la variable son
levels(d$mom_hs)
## [1] "no" "si"
EL nivel de referencia es “no”. Los valores que R asigna internamente a cada nivel son
contrasts(d$mom_hs)
## si
## no 0
## si 1
Cambiamos el nivel de referencia:
d$mom_hs = relevel(d$mom_hs, ref = "si")
levels(d$mom_hs)
## [1] "si" "no"
Por tanto, los valores que asigna R a los distintos niveles son
contrasts(d$mom_hs)
## no
## si 0
## no 1
Ahora se puede aplicar la función lm():
m = lm(kid_score ~ mom_hs, data = d)
summary(m)
##
## Call:
## lm(formula = kid_score ~ mom_hs, data = d)
##
## Residuals:
## Min 1Q Median 3Q Max
## -57.55 -13.32 2.68 14.68 58.45
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 89.320 1.075 83.082 < 2e-16 ***
## mom_hsno -11.771 2.322 -5.069 5.96e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 19.85 on 432 degrees of freedom
## Multiple R-squared: 0.05613, Adjusted R-squared: 0.05394
## F-statistic: 25.69 on 1 and 432 DF, p-value: 5.957e-07
Vemos que ahora R ha creado la variable auxiliar mom_hsno, que toma los valores
Una tercera opción es utilizar el modelo sin ordenada en el origen:
\[ kid\_score = \beta_1 secundaria\_si + \beta_2 secundaria\_no + e \]
en el que se utilizan las dos variables auxiliares pero se elimina el parámetro \(\beta_0\). Los modelos ahora son:
\[ kid\_score = \beta_1 + e \]
\[ kid\_score = \beta_2 + e \]
Luego \(\beta_1\) representa la puntuación media de los chicos cuya madre ha terminado secundaria y \(\beta_2\) representa la puntuación media de los chicos cuya madre NO ha terminado secundaria.
m = lm(kid_score ~ 0 + secundaria_si + secundaria_no, data = d)
summary(m)
##
## Call:
## lm(formula = kid_score ~ 0 + secundaria_si + secundaria_no, data = d)
##
## Residuals:
## Min 1Q Median 3Q Max
## -57.55 -13.32 2.68 14.68 58.45
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## secundaria_si 89.320 1.075 83.08 <2e-16 ***
## secundaria_no 77.548 2.059 37.67 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 19.85 on 432 degrees of freedom
## Multiple R-squared: 0.9506, Adjusted R-squared: 0.9504
## F-statistic: 4161 on 2 and 432 DF, p-value: < 2.2e-16
Con factores:
m = lm(kid_score ~ 0 + mom_hs, data = d)
summary(m)
##
## Call:
## lm(formula = kid_score ~ 0 + mom_hs, data = d)
##
## Residuals:
## Min 1Q Median 3Q Max
## -57.55 -13.32 2.68 14.68 58.45
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## mom_hssi 89.320 1.075 83.08 <2e-16 ***
## mom_hsno 77.548 2.059 37.67 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 19.85 on 432 degrees of freedom
## Multiple R-squared: 0.9506, Adjusted R-squared: 0.9504
## F-statistic: 4161 on 2 and 432 DF, p-value: < 2.2e-16
En el caso de tener regresores cualitativos con más de dos niveles:
levels(d$mom_work)
## [1] "notrabaja" "trabaja23" "trabaja1_parcial" "trabaja1_completo"
Definimos las variables axiliares:
notrabaja_si = ifelse(d$mom_work == "notrabaja", 1, 0)
trabaja23_si = ifelse(d$mom_work == "trabaja23", 1, 0)
trabaja1_parcial_si = ifelse(d$mom_work == "trabaja1_parcial", 1, 0)
trabaja1_completo_si = ifelse(d$mom_work == "trabaja1_completo", 1, 0)
Como la variable cualitativa tiene cuatro niveles, con tres variables auxiliares representamos todos los casos. El modelo general es:
\[ kid\_score = \beta_0 + \beta_1 trabaja23\_si + \beta_2 trabaja1\_parcial\_si + \beta_3 trabaja1\_completo\_si + e \]
\[ kid\_score = \beta_0 + e \]
ya que en este caso trabaja23_si = 0, trabaja1_parcial_si = 0 y trabaja1_completo_si = 0. Por tanto, la puntuación media de los chicos cuya madre no han trabajado es \(\beta_0\).
\[ kid\_score = \beta_0 + \beta_1 + e \]
por tanto \(\beta_1\) representa las diferencias entre la puntuación media de los chicos cuya madre no trabaja y los de las madres que trabajaron el segunto o tercer año.
\[ kid\_score = \beta_0 + \beta_2 + e \]
\[ kid\_score = \beta_0 + \beta_3 + e \]
En R:
m = lm(kid_score ~ trabaja23_si + trabaja1_parcial_si + trabaja1_completo_si, data = d)
summary(m)
##
## Call:
## lm(formula = kid_score ~ trabaja23_si + trabaja1_parcial_si +
## trabaja1_completo_si, data = d)
##
## Residuals:
## Min 1Q Median 3Q Max
## -65.85 -12.85 2.79 14.15 50.50
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 82.000 2.305 35.568 <2e-16 ***
## trabaja23_si 3.854 3.095 1.245 0.2137
## trabaja1_parcial_si 11.500 3.553 3.237 0.0013 **
## trabaja1_completo_si 5.210 2.704 1.927 0.0547 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 20.23 on 430 degrees of freedom
## Multiple R-squared: 0.02444, Adjusted R-squared: 0.01763
## F-statistic: 3.59 on 3 and 430 DF, p-value: 0.01377
Utilizando factores se obtienen los mismos resultados:
m = lm(kid_score ~ mom_work, data = d)
summary(m)
##
## Call:
## lm(formula = kid_score ~ mom_work, data = d)
##
## Residuals:
## Min 1Q Median 3Q Max
## -65.85 -12.85 2.79 14.15 50.50
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 82.000 2.305 35.568 <2e-16 ***
## mom_worktrabaja23 3.854 3.095 1.245 0.2137
## mom_worktrabaja1_parcial 11.500 3.553 3.237 0.0013 **
## mom_worktrabaja1_completo 5.210 2.704 1.927 0.0547 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 20.23 on 430 degrees of freedom
## Multiple R-squared: 0.02444, Adjusted R-squared: 0.01763
## F-statistic: 3.59 on 3 and 430 DF, p-value: 0.01377
Comprobamos que internamente R crea variables auxiliares según los valores:
levels(d$mom_work)
## [1] "notrabaja" "trabaja23" "trabaja1_parcial" "trabaja1_completo"
contrasts(d$mom_work)
## trabaja23 trabaja1_parcial trabaja1_completo
## notrabaja 0 0 0
## trabaja23 1 0 0
## trabaja1_parcial 0 1 0
## trabaja1_completo 0 0 1
Podemos hacer otras comparaciones cambiando la variable de referencia:
d$mom_work = relevel(d$mom_work, ref="trabaja1_parcial")
levels(d$mom_work)
## [1] "trabaja1_parcial" "notrabaja" "trabaja23" "trabaja1_completo"
m = lm(kid_score ~ mom_work, data = d)
summary(m)
##
## Call:
## lm(formula = kid_score ~ mom_work, data = d)
##
## Residuals:
## Min 1Q Median 3Q Max
## -65.85 -12.85 2.79 14.15 50.50
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 93.500 2.703 34.587 <2e-16 ***
## mom_worknotrabaja -11.500 3.553 -3.237 0.0013 **
## mom_worktrabaja23 -7.646 3.402 -2.248 0.0251 *
## mom_worktrabaja1_completo -6.290 3.050 -2.062 0.0398 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 20.23 on 430 degrees of freedom
## Multiple R-squared: 0.02444, Adjusted R-squared: 0.01763
## F-statistic: 3.59 on 3 and 430 DF, p-value: 0.01377
Como observamos, el nivel de referencia, que en este caso es “trabaja1_parcial”, no aparece explícitamente en el modelo. Efectivamente, el modelo sería:
\[ kid\_score = \beta_0 + \beta_1 notrabaja\_si + \beta_2 trabaja23\_si + \beta_3 trabaja1\_completo\_si + e \]
El caso de la variable trabaja1_parcial aparece cuando el resto de variables toma el valor cero. En ese caso el modelos sería:
\[ kid\_score = \beta_0 + e \]
Además de cambiar el nivel de referencia, también se podría reordenar los niveles de la variable factor:
d$mom_work1 = factor(d$mom_work, levels=c("trabaja1_completo","trabaja23","notrabaja","trabaja1_parcial"))
levels(d$mom_work1)
## [1] "trabaja1_completo" "trabaja23" "notrabaja" "trabaja1_parcial"
m = lm(kid_score ~ mom_work1, data = d)
summary(m)
##
## Call:
## lm(formula = kid_score ~ mom_work1, data = d)
##
## Residuals:
## Min 1Q Median 3Q Max
## -65.85 -12.85 2.79 14.15 50.50
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 87.210 1.413 61.723 <2e-16 ***
## mom_work1trabaja23 -1.356 2.502 -0.542 0.5882
## mom_work1notrabaja -5.210 2.704 -1.927 0.0547 .
## mom_work1trabaja1_parcial 6.290 3.050 2.062 0.0398 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 20.23 on 430 degrees of freedom
## Multiple R-squared: 0.02444, Adjusted R-squared: 0.01763
## F-statistic: 3.59 on 3 and 430 DF, p-value: 0.01377
Como vemos de nuevo, el nivel de referencia no aparece explícitamente.
Lo más frecuente es contar con regresores cualitativos y cuantitativos de manera simultánea. Por ejemplo, vamos a introducir en el modelo el regresor mom_iq que es cuantitativo, y el regresor mom_hs que es cualitativo. Para este último ya tenemos definida la variable auxiliar:
El modelo que vamos a analizar es
\[ kid\_score = \beta_0 + \beta_1 mom\_iq + \beta_2 secundaria\_si + e \]
Por tanto:
Tenemos dos rectas, con la misma pendiente y distinta \(\beta_0\). En R:
m = lm(kid_score ~ mom_iq + secundaria_si, data = d)
summary(m)
##
## Call:
## lm(formula = kid_score ~ mom_iq + secundaria_si, data = d)
##
## Residuals:
## Min 1Q Median 3Q Max
## -52.873 -12.663 2.404 11.356 49.545
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 25.73154 5.87521 4.380 1.49e-05 ***
## mom_iq 0.56391 0.06057 9.309 < 2e-16 ***
## secundaria_si 5.95012 2.21181 2.690 0.00742 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 18.14 on 431 degrees of freedom
## Multiple R-squared: 0.2141, Adjusted R-squared: 0.2105
## F-statistic: 58.72 on 2 and 431 DF, p-value: < 2.2e-16
Gráficamente:
# Para estar seguro del nivel de referencia:
d$mom_hs = relevel(d$mom_hs, ref="no")
plot(d$mom_iq, d$kid_score, col = d$mom_hs, pch = 20)
abline(a = m$coefficients["(Intercept)"], b = m$coefficients["mom_iq"], col = "black")
abline(a = m$coefficients["(Intercept)"] + m$coefficients["secundaria_si"],
b = m$coefficients["mom_iq"], col = "red")
legend("topleft", legend = c("mom_hs = no", "mom_hs = si"), col = c("black", "red"), pch = 20, cex = 0.8)
Si llamamos dif_100 a la diferencia entre la puntuación media de un chico cuya madre tiene mom_iq = 100 y no ha terminado secundaria y la puntuación media de un chico cuya madre tiene mom_iq = 100 y si ha terminado secundaria; y dif_120 a la diferencia entre la puntuación media de un chico cuya madre tiene mom_iq = 120 y no ha terminado secundaria y la puntuación media de un chico cuya madre tiene mom_iq = 120 y si ha terminado secundaria. Entonces, dif_100 = dif_120 = \(\beta_2\).
Si utilizamos directamente los factores en el modelo, R automáticamente crea las variables auxiliares necesarias:
m = lm(kid_score ~ mom_iq + mom_hs, data = d)
summary(m)
##
## Call:
## lm(formula = kid_score ~ mom_iq + mom_hs, data = d)
##
## Residuals:
## Min 1Q Median 3Q Max
## -52.873 -12.663 2.404 11.356 49.545
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 25.73154 5.87521 4.380 1.49e-05 ***
## mom_iq 0.56391 0.06057 9.309 < 2e-16 ***
## mom_hssi 5.95012 2.21181 2.690 0.00742 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 18.14 on 431 degrees of freedom
## Multiple R-squared: 0.2141, Adjusted R-squared: 0.2105
## F-statistic: 58.72 on 2 and 431 DF, p-value: < 2.2e-16
El resultado, como no podía ser de otra manera, es el mismo.
En el modelo de la sección anterior se ha modelado el efecto de mom_iq y mom_hs por separado. Sin embargo es posible incluir la interacción de ambas variables, es decir: para las madres que SI terminaron secundaria como influye la variables mom_iq, y para las madres que NO terminaron secundaria, como influye mom_iq. El modelo se escribe así:
\[ kid\_score = \beta_0 + \beta_1 mom\_iq + \beta_2 secundaria\_si + \beta_3 secundaria\_si * mom\_iq + e \]
Como vemos, este modelo incluye dos submodelos:
si la madre no ha terminado secundaria secundaria_si = 0: \(kid\_score = \beta_0 + \beta_1 mom\_iq + e\)
si la madre si ha terminado secundaria secundaria_si = 1: \(kid\_score = (\beta_0 + \beta_2) + (\beta_1 + \beta_3) mom\_iq + e\)
Luego tenemos dos modelos con ordenadas en el origen y pendiente diferentes. En R introducimos la interacción haciendo:
m = lm(kid_score ~ mom_iq + secundaria_si + I(mom_iq*secundaria_si), data = d)
summary(m)
##
## Call:
## lm(formula = kid_score ~ mom_iq + secundaria_si + I(mom_iq *
## secundaria_si), data = d)
##
## Residuals:
## Min 1Q Median 3Q Max
## -52.092 -11.332 2.066 11.663 43.880
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -11.4820 13.7580 -0.835 0.404422
## mom_iq 0.9689 0.1483 6.531 1.84e-10 ***
## secundaria_si 51.2682 15.3376 3.343 0.000902 ***
## I(mom_iq * secundaria_si) -0.4843 0.1622 -2.985 0.002994 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 17.97 on 430 degrees of freedom
## Multiple R-squared: 0.2301, Adjusted R-squared: 0.2247
## F-statistic: 42.84 on 3 and 430 DF, p-value: < 2.2e-16
Gráficamente:
plot(d$mom_iq, d$kid_score, col = d$mom_hs, pch = 20)
abline(a = m$coefficients["(Intercept)"], b = m$coefficients["mom_iq"], col = "black")
abline(a = m$coefficients["(Intercept)"] + m$coefficients["secundaria_si"],
b = m$coefficients["mom_iq"] + m$coefficients["I(mom_iq * secundaria_si)"], col = "red")
En este modelo, la diferencia entre puntuaciones medias de chicos no es constante como antes, depende simultáneamente del valor de mom_iq de su madre y de si terminó o no la secundaria.
Con factores, la interacción entre variables se incluye con los dos puntos:
m = lm(kid_score ~ mom_iq + mom_hs + mom_iq:mom_hs, data = d)
summary(m)
##
## Call:
## lm(formula = kid_score ~ mom_iq + mom_hs + mom_iq:mom_hs, data = d)
##
## Residuals:
## Min 1Q Median 3Q Max
## -52.092 -11.332 2.066 11.663 43.880
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -11.4820 13.7580 -0.835 0.404422
## mom_iq 0.9689 0.1483 6.531 1.84e-10 ***
## mom_hssi 51.2682 15.3376 3.343 0.000902 ***
## mom_iq:mom_hssi -0.4843 0.1622 -2.985 0.002994 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 17.97 on 430 degrees of freedom
## Multiple R-squared: 0.2301, Adjusted R-squared: 0.2247
## F-statistic: 42.84 on 3 and 430 DF, p-value: < 2.2e-16
Otra alternativa es utilizar el signo de multiplicación, que incluye los regresores por separado y la interacción:
m = lm(kid_score ~ mom_iq * mom_hs, data = d)
summary(m)
##
## Call:
## lm(formula = kid_score ~ mom_iq * mom_hs, data = d)
##
## Residuals:
## Min 1Q Median 3Q Max
## -52.092 -11.332 2.066 11.663 43.880
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -11.4820 13.7580 -0.835 0.404422
## mom_iq 0.9689 0.1483 6.531 1.84e-10 ***
## mom_hssi 51.2682 15.3376 3.343 0.000902 ***
## mom_iq:mom_hssi -0.4843 0.1622 -2.985 0.002994 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 17.97 on 430 degrees of freedom
## Multiple R-squared: 0.2301, Adjusted R-squared: 0.2247
## F-statistic: 42.84 on 3 and 430 DF, p-value: < 2.2e-16