# Leemos y guardamos la base de datos en el objeto big5
<- read.csv("https://david-ti.github.io/introstats/data/big_five.csv")
big5
# Itéms invertidos
$n2i <- (5 + 1) - big5$n2
big5$n4i <- (5 + 1) - big5$n4
big5
# Creamos la variable a partir de los promedios de neuroticismo
$media_neuro <- rowMeans(big5[,c("n1","n2i","n3","n4i","n5","n6","n7","n8","n9","n10")]
big5na.rm = TRUE)
,
# Creamos la variable a partir de los promedios de extroversión
$media_extro <- rowMeans(big5[,c("e1","e2","e3","e4","e5","e6","e7","e8","e9","e10")]
big5na.rm = TRUE) ,
Apuntes de R
Parte 3: Introducción a regresión lineal simple
Regresión lineal simple
Para el introducir el uso de regresión lineal simple, se presentrá el uso del modelo compacto y el modelo ampliado de regresión. Trabajaremos con la media de neuroticismo y la media de extraversión de la base de datos de los “Big five”.
Modelo compacto
A continuación, generamos un resumen de un modelo lineal en el cual predecimos los datos de la variable neuroticismo en función del intercepto. Para calcular un modelo de regresión lineal haremos uso de la función lm
.
# Visaulizamos el resumen
summary(lm(big5$media_neuro ~ 1))
Call:
lm(formula = big5$media_neuro ~ 1)
Residuals:
Min 1Q Median 3Q Max
-2.039 -0.639 0.061 0.661 1.961
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 3.03900 0.03777 80.46 <2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.8445 on 499 degrees of freedom
¿Cuales son los datos relevantes que debemos considerar?
Dato | Valor | Significado |
---|---|---|
Estimate | 3.03900 | Promedio |
Residual standard error | 0.8445 | Desviación estándar (basada en la suma de cuadrados) |
Modelo ampliado
Ahora, generamos un resumen de los resultados de un modelo lineal en el cual predecimos los datos de la variable neuroticismo en función de la variable extraversión.
# Visaulizamos el resumen
summary(lm(big5$media_neuro ~ 1+big5$media_extro))
Call:
lm(formula = big5$media_neuro ~ 1 + big5$media_extro)
Residuals:
Min 1Q Median 3Q Max
-2.1004 -0.6268 0.0119 0.6242 1.9732
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 3.4192 0.3367 10.156 <2e-16 ***
big5$media_extro -0.1226 0.1079 -1.137 0.256
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.8443 on 498 degrees of freedom
Multiple R-squared: 0.002587, Adjusted R-squared: 0.0005841
F-statistic: 1.292 on 1 and 498 DF, p-value: 0.2563
También, podemos visualizar el resumen del siguiente modo:
# Visaulizamos el resumen
summary(lm(big5$media_neuro ~ big5$media_extro))
Call:
lm(formula = big5$media_neuro ~ big5$media_extro)
Residuals:
Min 1Q Median 3Q Max
-2.1004 -0.6268 0.0119 0.6242 1.9732
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 3.4192 0.3367 10.156 <2e-16 ***
big5$media_extro -0.1226 0.1079 -1.137 0.256
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.8443 on 498 degrees of freedom
Multiple R-squared: 0.002587, Adjusted R-squared: 0.0005841
F-statistic: 1.292 on 1 and 498 DF, p-value: 0.2563
¿Cuales son los datos relevantes que debemos considerar?
Dato | Valor | Significado |
---|---|---|
Estimate / (Intercept) | 3.4192 | Coeficiente del intercepto |
Estimate / big5$media_extro | -0.1226 | Coeficiente de la pendiente |
Residual standard error | 0.8443 | Desviación estándar de los residuos |
Multiple R-squared | 0.002587 | Coeficiente de determinación (Reducción de la variabilidad no explicada del modelo) |
Std. Error / (Intercept) | 0.3367 | Error estándar de la estimación del intercepto |
Std. Error / big5$media_extro | 0.1079 | Error estándar de la estimación de la pendiente |
Interpretación del modelo de regresión
La regresión predice un nivel promedio de 3.4 puntos en la escala de neuroticismo para aquellas personas un nivel promedio de 0 puntos en la escala de extraversión. Recuerden que nos indica donde se ubica la recta
La pendiente tiene un valor de -0.12, lo cual indica una relación negativa entre los puntajes en la escala de extraversión y los puntajes en la escala de neuroticismo. Nos inidca que se espera un cambio en el promedio de la variable neuroticismo de -0.12 puntos antes un aumento de 1 unidad en promedio en la variable extraversión.
La desviación estándar de los residuos es de 0.84 puntos, indicándonos que en general, al hacer una predicción en base a la recta de regresión esperamos que los residuos pueden estar típicamente entre 1.68 puntos más arriba o más abajo que nuestra predicción de la media condicional.
Por último, la introducción del predictor (en este caso, la variable extraversión) ha reducido los residuos del modelo base (medidos usando la suma de cuadrados de los residuos) en un 0.2%.
Dispersograma con recta de regresión
Para analizar gráficamente la relación entre estas variables, podemos generar un diagrama de dispersión que permita visualizar las medias de neuroticismo y las medias de extraversión. Adicionalmente, es posible graficar la recta de regresión correspondiente con la función abline
, de manera que nos muestre la tendencia general de los datos.
# Graficamos
with(big5,plot(media_extro,jitter(media_neuro),
main="Dispersiograma",
xlab="Extraversión",
ylab="Neuroticismo"))
# Agregamos la recta de regresión
abline(lm(big5$media_neuro ~ big5$media_extro))
Comparación de modelos
Al momento de querer comparar disitntos modelos de regresión estaremos trabajando con comparaciones de modelos anidados, es decir, que uno de los modelos sea un caso especial del otro. En este caso trabajaremos con el modelo compacto y el modelo ampliado presentados anteriormente.
Nos interesa es evaluar que tanto cambia el error (la suma de cuadrados de los residuos) entre estos dos modelos, sabiendo que ese cambio se debe a los parámetros adicionales en el modelo ampliados.
R2 como indicador de comparación de ajuste
Tal como vimos en clases, podemos comparar modelos a partir del cálculo de la reducción proporcional del error, es decir, a partir del cálculo de R2. Este valor se encuentra denominado como Multiple R-squared en el resumen que nos brinda R del cálculo de la regresión lineal simple.
¿Cuáles son los pasos para llegar este valor?
- Calculamos la suma la cuadrados totales
\[ SST \]
= sum(resid(lm(big5$media_neuro ~ 1))^2)
SST
SST
[1] 355.9095
- Calculamos la suma la cuadrados del modelo ampliado
\[ SSE_A \]
= sum(resid(lm(big5$media_neuro ~ big5$media_extro))^2)
SSEA
SSEA
[1] 354.9888
- Calculamos la reducción en la suma la cuadrados
\[ SSR = {SST - SSE_A} \]
= SST - SSEA
SSR
SSR
[1] 0.9207307
- Calculamos la reducción proporcional del error
\[ R^2 = \dfrac{SST - SSE_A}{SST} \]
= (SST - SSEA)/SST
R_cuadrado
R_cuadrado
[1] 0.00258698
Vemos que este equivale al Multiple R-squared en el resumen que nos brinda R.
En este caso vemos que el error cambia un 0.2% entre los dos modelos.
Relación del Coeficiente de Regresión estandarizado y el Coeficiente de Correlación
El coeficiente de regresión estandarizado y el coeficiente de correlación están relacionados, ya que ambos indican la fuerza y la dirección de la relación entre dos variables. Mientras que el coeficiente de correlación mide la asociación lineal entre las variables en su escala original, el coeficiente de regresión estandarizado proporciona esta medida después de estandarizar las variables, lo que facilita la comparación entre diferentes conjuntos de datos al tener una escala común (media de 0 y desviación estándar de 1).
### Forma 1
#Convertimos a puntaje Z los valores de ambas variables utilizadas en el análisis.
$Puntajes_Z_me <- scale(big5$media_extro)
big5$Puntajes_z_mn <- scale(big5$media_neuro)
big5
#Hacemos la regresión para extroversión como variable dependiente y neuroticismo como variable independiente, con los puntajes estandarizados en vez de los originales.
= lm(big5$Puntajes_z_mn~big5$Puntajes_Z_me)
Regresion1 summary(Regresion1)
Call:
lm(formula = big5$Puntajes_z_mn ~ big5$Puntajes_Z_me)
Residuals:
Min 1Q Median 3Q Max
-2.48700 -0.74216 0.01409 0.73905 2.33644
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -1.964e-16 4.471e-02 0.000 1.000
big5$Puntajes_Z_me -5.086e-02 4.475e-02 -1.137 0.256
Residual standard error: 0.9997 on 498 degrees of freedom
Multiple R-squared: 0.002587, Adjusted R-squared: 0.0005841
F-statistic: 1.292 on 1 and 498 DF, p-value: 0.2563
#Utilizamos el análisis de correlación para comprobar que el valor obtenido es igual al obtenido en el coeficiente de regresión del análisis anterior.
cor.test(big5$media_neuro,big5$media_extro, use=pairwise.complete.obs)
Pearson's product-moment correlation
data: big5$media_neuro and big5$media_extro
t = -1.1365, df = 498, p-value = 0.2563
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
-0.13793773 0.03699322
sample estimates:
cor
-0.05086236
Forma 2
#Hacemos la regresión para la media de neuroticismo como variable dependiente y la media de extroversión como variable independiente, con los puntajes estandarizados en vez de los originales.
= lm(scale(big5$media_neuro)~scale(big5$media_extro))
Regresion2 summary(Regresion2)
Call:
lm(formula = scale(big5$media_neuro) ~ scale(big5$media_extro))
Residuals:
Min 1Q Median 3Q Max
-2.48700 -0.74216 0.01409 0.73905 2.33644
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -1.964e-16 4.471e-02 0.000 1.000
scale(big5$media_extro) -5.086e-02 4.475e-02 -1.137 0.256
Residual standard error: 0.9997 on 498 degrees of freedom
Multiple R-squared: 0.002587, Adjusted R-squared: 0.0005841
F-statistic: 1.292 on 1 and 498 DF, p-value: 0.2563
#Utilizamos el análisis de correlación para comprobar que el valor obtenido es igual al obtenido en el coeficiente de regresión del análisis anterior.
cor.test(big5$media_neuro,big5$media_extro, use=pairwise.complete.obs)
Pearson's product-moment correlation
data: big5$media_neuro and big5$media_extro
t = -1.1365, df = 498, p-value = 0.2563
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
-0.13793773 0.03699322
sample estimates:
cor
-0.05086236
Forma 3
#Creamos el objeto que contiente los resultados del análisis de regresión lineal para el neuroticismo como variable dependiente y la extroversión como variable independiente.
= lm(big5$media_neuro~big5$media_extro)
Regresion3
#Utilizamos la función lm.beta sobre el objeto Regresion1 para obtener el coeficiente de regresión estandarizado. Para poder utilizar esta función debemos descargar y cargar la librería QuantPsyc.
#install.packages("QuantPsyc")
library(QuantPsyc)
Loading required package: boot
Loading required package: dplyr
Attaching package: 'dplyr'
The following objects are masked from 'package:stats':
filter, lag
The following objects are masked from 'package:base':
intersect, setdiff, setequal, union
Loading required package: purrr
Loading required package: MASS
Attaching package: 'MASS'
The following object is masked from 'package:dplyr':
select
Attaching package: 'QuantPsyc'
The following object is masked from 'package:base':
norm
#Utilizamos la función lm.beta para obtener el coeficiente de regresión estandarizado.
lm.beta(Regresion3)
big5$media_extro
-0.05086236
#Utilizamos el análisis de correlación para comprobar que el valor obtenido es igual al obtenido en el coeficiente de regresión estandarizado.
cor.test(big5$media_neuro,big5$media_extro, use=pairwise.complete.obs)
Pearson's product-moment correlation
data: big5$media_neuro and big5$media_extro
t = -1.1365, df = 498, p-value = 0.2563
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
-0.13793773 0.03699322
sample estimates:
cor
-0.05086236
Como podemos ver en los outputs, el coeficiente de regresión estandarizado para la variable de extroversión es aproximadamente -0.05, mientras que el coeficiente de correlación de Pearson entre las variables de neuroticismo y extroversión es también aproximadamente -0.05. Ambos valores son coherentes y muestran una relación débil y negativa entre las dos variables.
Aclaración práctica
Es importante que sepamos que cuando realizamos un modelo de regresión en R y lo guardamos en un objeto no solo se alojan en este los datos que vemos cuando usamos la función “summary”, sino que además se guardan una serie de datos adicionales. Para entenderlo mejor vamos a realizar un modelo de regresión con la variable media neuro como variable de respuesta y la variable edad como variable independiente y lo guardaremos en el objeto “regresion1”. Para esto haremos uso de la función lm
.
# Guardamos el modelo de regresión
<- lm(big5$age ~ 1 + big5$media_neuro) regresion1
Ahora que hemos guardado el modelo de regresión en un objeto, revisemoslo.
# Guardamos el modelo de regresión
str(regresion1)
List of 13
$ coefficients : Named num [1:2] 32.12 -2.22
..- attr(*, "names")= chr [1:2] "(Intercept)" "big5$media_neuro"
$ residuals : Named num [1:497] -0.672 -5.561 -2.672 13.217 -11.672 ...
..- attr(*, "names")= chr [1:497] "1" "2" "3" "4" ...
$ effects : Named num [1:497] -565.46 -41.92 -2.62 13.42 -11.36 ...
..- attr(*, "names")= chr [1:497] "(Intercept)" "big5$media_neuro" "" "" ...
$ rank : int 2
$ fitted.values: Named num [1:497] 27.7 26.6 25.7 26.8 27.7 ...
..- attr(*, "names")= chr [1:497] "1" "2" "3" "4" ...
$ assign : int [1:2] 0 1
$ qr :List of 5
..$ qr : num [1:497, 1:2] -22.2935 0.0449 0.0449 0.0449 0.0449 ...
.. ..- attr(*, "dimnames")=List of 2
.. .. ..$ : chr [1:497] "1" "2" "3" "4" ...
.. .. ..$ : chr [1:2] "(Intercept)" "big5$media_neuro"
.. ..- attr(*, "assign")= int [1:2] 0 1
..$ qraux: num [1:2] 1.04 1.03
..$ pivot: int [1:2] 1 2
..$ tol : num 1e-07
..$ rank : int 2
..- attr(*, "class")= chr "qr"
$ df.residual : int 495
$ na.action : 'omit' Named int [1:3] 8 208 225
..- attr(*, "names")= chr [1:3] "8" "208" "225"
$ xlevels : Named list()
$ call : language lm(formula = big5$age ~ 1 + big5$media_neuro)
$ terms :Classes 'terms', 'formula' language big5$age ~ 1 + big5$media_neuro
.. ..- attr(*, "variables")= language list(big5$age, big5$media_neuro)
.. ..- attr(*, "factors")= int [1:2, 1] 0 1
.. .. ..- attr(*, "dimnames")=List of 2
.. .. .. ..$ : chr [1:2] "big5$age" "big5$media_neuro"
.. .. .. ..$ : chr "big5$media_neuro"
.. ..- attr(*, "term.labels")= chr "big5$media_neuro"
.. ..- attr(*, "order")= int 1
.. ..- attr(*, "intercept")= int 1
.. ..- attr(*, "response")= int 1
.. ..- attr(*, ".Environment")=<environment: R_GlobalEnv>
.. ..- attr(*, "predvars")= language list(big5$age, big5$media_neuro)
.. ..- attr(*, "dataClasses")= Named chr [1:2] "numeric" "numeric"
.. .. ..- attr(*, "names")= chr [1:2] "big5$age" "big5$media_neuro"
$ model :'data.frame': 497 obs. of 2 variables:
..$ big5$age : int [1:497] 27 21 23 40 16 22 29 23 16 19 ...
..$ big5$media_neuro: num [1:497] 2 2.5 2.9 2.4 2 2.2 2.9 4.4 2.2 2.9 ...
..- attr(*, "terms")=Classes 'terms', 'formula' language big5$age ~ 1 + big5$media_neuro
.. .. ..- attr(*, "variables")= language list(big5$age, big5$media_neuro)
.. .. ..- attr(*, "factors")= int [1:2, 1] 0 1
.. .. .. ..- attr(*, "dimnames")=List of 2
.. .. .. .. ..$ : chr [1:2] "big5$age" "big5$media_neuro"
.. .. .. .. ..$ : chr "big5$media_neuro"
.. .. ..- attr(*, "term.labels")= chr "big5$media_neuro"
.. .. ..- attr(*, "order")= int 1
.. .. ..- attr(*, "intercept")= int 1
.. .. ..- attr(*, "response")= int 1
.. .. ..- attr(*, ".Environment")=<environment: R_GlobalEnv>
.. .. ..- attr(*, "predvars")= language list(big5$age, big5$media_neuro)
.. .. ..- attr(*, "dataClasses")= Named chr [1:2] "numeric" "numeric"
.. .. .. ..- attr(*, "names")= chr [1:2] "big5$age" "big5$media_neuro"
..- attr(*, "na.action")= 'omit' Named int [1:3] 8 208 225
.. ..- attr(*, "names")= chr [1:3] "8" "208" "225"
- attr(*, "class")= chr "lm"
Podemos observar que el objeto regresion1 contiene una serie de datos. Algunas de las partes más importantes son:
- coefficients: Un vector con los coeficientes estimados (intercepto y pendientes).
- residuals: Un vector con los residuos (diferencias entre valores observados y predichos).
- fitted.values: Un vector con los valores predichos por el modelo.
- rank: El rango del modelo, que indica cuántos coeficientes fueron estimados.
- df.residual: Los grados de libertad residuales.
- call: La llamada original a lm(), útil para reproducir el modelo.
- formula: La fórmula usada en la regresión.
- model: Los datos originales usados en la regresión.
Para efectos del curso es importante que podamos observar como se distribuyen los residuos. Para ello podemos realizar un histrograma de la siguiente manera.
# Histograma de residuos de regresion1
hist(regresion1$residuals)