Ejercicios Regresión Lineal Simple

Rubén Pizarro Gurrola

Objetivo

Determinar predicciones de datos bajo el modelo de regresión lineal simple.

Descripción

De un conjunto de datos con dos variables (bivariable) en donde una de ellas es \(X\) variable independiente y otra de ellas \(Y\) variable dependiente, predecir el valor de Y conforme la historia de X.

Mínimos cuadrados

\[Y = a + bx\]

En donde:

  • \(Y\) es el valor a predecir
  • \(a\) Es el valor del cruce del eje y
  • \(b\) Es el valor de la pendiente o inclinación.
  • \(x\) el valor de la variable independiente

Coeficientes a y b

\[ b = r \cdot(\frac{ s_{y}}{s_x}) = r \cdot \frac{\sqrt{ \frac{\sum_{i=1}^n(y_i- \bar{y})^2}{n-1}}} {\sqrt{ \frac{\sum_{i=1}^n(x_i- \bar{x})^2}{n-1}}} \]

En donde:

  • \(r\) es el coeficiente de correlación.

  • \(S_y\) es la desviación estándar de \(y\). \(\text {es el denominador}\)

  • \(S_x\) es la desviación estándar de la variable \(x\). \(\text{es el numerador}\)

Y para determinar a:

\[a = \bar{y} - b \cdot\bar{x}\]

  • Se requiere la media de y \(\bar{y}\)
  • Se necesita la media de x \(\bar{x}\)
  • Se requiere el valor de \(b\), previamente calculado

Librerías

library(dplyr)
library(mosaic)
library(readr)
library(ggplot2)  # Para gráficos
library(knitr)    # Para formateo de datos
library(kableExtra)
options(scipen = 999) # Notación normal

Funciones personalizadas

Se cagan funciones previamente codificadas

source("https://raw.githubusercontent.com/rpizarrog/probabilidad-y-estad-stica/master/Agosto-Diciembre%202022/funciones/funciones%20para%20dispersion%20correlacion%20regresion.R", encoding = "UTF-8")

Ejemplo

Ejemplo de los goles predicen puntos

goles <- c(8, 4, 4, 6, 8, 7, 6, 5, 7, 8)
puntos <- c(9, 3, 5, 8, 8, 7, 5, 6, 6, 10)

datos <- data.frame(goles, puntos)
datos
   goles puntos
1      8      9
2      4      3
3      4      5
4      6      8
5      8      8
6      7      7
7      6      5
8      5      6
9      7      6
10     8     10

Mandar llamar la función

resultado <- f_reg_lineal_simple(datos)

La dispersión

resultado$dispersion

La tabla

tabla <- resultado$tabla %>%
  kbl(caption = "Desviaciones estándar, covarianza, correlación y coeficientes de a y b en regresión lineal simple", booktabs = TRUE, escape = FALSE) %>%
   kable_styling(font_size = 16, latex_options = "striped")

La Tabla

tabla
Desviaciones estándar, covarianza, correlación y coeficientes de a y b en regresión lineal simple
goles puntos media.x media.y x_menos_media.x y_menos_media.y x_menos_media.x_cuad y_menos_media.y_cuad x_menos_media.x_cuad_POR_y_menos_media.y_cuad
1 8 9 6.3 6.7 1.7 2.3 2.89 5.29 3.91
2 4 3 6.3 6.7 -2.3 -3.7 5.29 13.69 8.51
3 4 5 6.3 6.7 -2.3 -1.7 5.29 2.89 3.91
4 6 8 6.3 6.7 -0.3 1.3 0.09 1.69 -0.39
5 8 8 6.3 6.7 1.7 1.3 2.89 1.69 2.21
6 7 7 6.3 6.7 0.7 0.3 0.49 0.09 0.21
7 6 5 6.3 6.7 -0.3 -1.7 0.09 2.89 0.51
8 5 6 6.3 6.7 -1.3 -0.7 1.69 0.49 0.91
9 7 6 6.3 6.7 0.7 -0.7 0.49 0.49 -0.49
10 8 10 6.3 6.7 1.7 3.3 2.89 10.89 5.61
Sumatorias 63 67 63.0 67.0 0.0 0.0 22.10 40.10 24.90

Estadísticos

resultado$estadisticos
  media_x media.y desv.std.x desv.std.y Covarianza Correlación
1     6.3     6.7   1.567021   2.110819   2.766667   0.8364327

Calcular b de Y = a + bx

\[ b = r \cdot(\frac{ s_{y}}{s_x}) = r \cdot \frac{\sqrt{ \frac{\sum_{i=1}^n(y_i- \bar{y})^2}{n-1}}} {\sqrt{ \frac{\sum_{i=1}^n(x_i- \bar{x})^2}{n-1}}} = cor(datos) \cdot \frac{ds(datos$goles)}{ds(datos$puntos)} \therefore \]

\[ b = 0.836432 \cdot \frac{2.110819}{1.567021} = 1.126697 \]

b = resultado$estadisticos$Correlación * (resultado$estadisticos$desv.std.y / resultado$estadisticos$desv.std.x)
print(b)
[1] 1.126697

directamente con cor() y sd()

bb <- cor(datos$goles, datos$puntos) * (sd(datos$puntos) / sd(datos$goles))
bb
[1] 1.126697

Calcular a de Y = a + bx

\[ a = \bar{y} - b \cdot\bar{x} \therefore \]

\[ a = 6.7 - 1.126697 \cdot 6.3 = -0.39819 \]

a <- resultado$estadisticos$media.y - b * resultado$estadisticos$media_x
print(a)
[1] -0.39819

Predicción para nuevo valor de \(x_i=4\) goles

\[ Y = a + bx = -0.39819 + 1.126697 \cdot 4 = 4.108597 \]

Y = a + b * (4)
paste("Para 4 goles, la predicción sería " , round(Y, 6), "puntos")
[1] "Para 4 goles, la predicción sería  4.108597 puntos"

Usando la función lm()

Se construye un modelo de regresión lineal simple con los datos y la fórmula en donde los puntos dependen de los goles. puntos ~ goles

modelo <- lm(data = datos, formula = puntos ~ goles)

Resumen del modelo

resumen <- summary(modelo)
resumen

Call:
lm(formula = puntos ~ goles, data = datos)

Residuals:
     Min       1Q   Median       3Q      Max 
-1.48869 -0.98529 -0.05204  0.85973  1.63801 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)   
(Intercept)  -0.3982     1.6896  -0.236  0.81960   
goles         1.1267     0.2610   4.317  0.00256 **
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 1.227 on 8 degrees of freedom
Multiple R-squared:  0.6996,    Adjusted R-squared:  0.6621 
F-statistic: 18.63 on 1 and 8 DF,  p-value: 0.002558

Los coeficientes a y b

resumen$coefficients[1]  # Valor a
[1] -0.39819
resumen$coefficients[2]  # Valor b
[1] 1.126697

Correlación al cuadrado R Square

R Square significa que los goles representan y explican aproximadamente el 69% a la variable puntos.

r2 <- resultado$estadisticos$Correlación^2
r2
[1] 0.6996197

Y las predicciones con el modelo

prediccion <- predict(object = modelo, newdata = data.frame(goles = c(4)))
paste("Para un valor de 4 goles, l apredicción sería ", round(prediccion), "puntos")
[1] "Para un valor de 4 goles, l apredicción sería  4 puntos"

Linea de tendencia

f_linea_tendencia_reg_lineal(datos, modelo)

Caso temperatura ambiente y presión arterial

¿Qué es presión arterial?

La presión arterial es la fuerza que la sangre ejerce contra las paredes arteriales. Se mide y se registra con dos números.

El primer número, presión arterial sistólica, es causada cuando el corazón se contrae y empuja la sangre hacia afuera.

El segundo número, presión arterial diastólica, es la presión que ocurre cuando el corazón se relaja y se llena de sangre.

¿Qué es presión arterial?

Se expresa colocando la presión arterial sistólica sobre el número de la presión arterial diastólica, por ejemplo, 138/72. La presión normal para adultos se define como una presión sistólica de menos de 120 y una presión diastólica de menos de 80. Esto se indica como 120/80.

Por lo general, se presta más atención a la presión arterial sistólica (el primer número) como factor de riesgo principal de enfermedades cardiovasculares en personas mayores de 50 años

Cargar datos

datos <- read.csv("https://raw.githubusercontent.com/rpizarrog/probabilidad-y-estad-stica/master/Agosto-Diciembre%202022/datos/temperatura.ambiente_presion.arterial.csv", stringsAsFactors = TRUE, encoding = "UTF-8")

Estructura datos

str(datos)
'data.frame':   700 obs. of  4 variables:
 $ temperatura: num  12 5 12 12 15.7 ...
 $ sistolica  : int  116 103 117 120 118 117 113 121 118 120 ...
 $ diastolica : int  73 76 84 86 82 74 82 93 81 86 ...
 $ sis_dis    : Factor w/ 126 levels "102/68","104/68",..: 52 4 74 102 82 65 25 113 81 102 ...

Análisis descriptivo datos

summary(datos)
  temperatura      sistolica       diastolica        sis_dis   
 Min.   : 3.00   Min.   :102.0   Min.   : 66.00   120/90 : 48  
 1st Qu.:12.00   1st Qu.:114.0   1st Qu.: 78.00   116/81 : 20  
 Median :12.00   Median :117.0   Median : 82.00   119/89 : 20  
 Mean   :14.35   Mean   :116.5   Mean   : 83.09   109/79 : 19  
 3rd Qu.:17.03   3rd Qu.:119.0   3rd Qu.: 88.00   110/80 : 19  
 Max.   :28.00   Max.   :131.0   Max.   :102.00   115/78 : 18  
                                                  (Other):556  

Primeros 10 registros

head(datos, 10)
   temperatura sistolica diastolica sis_dis
1        12.00       116         73  116/73
2         5.00       103         76  106/76
3        12.00       117         84  117/84
4        12.00       120         86  120/86
5        15.67       118         82  118/82
6        12.00       117         74  117/74
7         9.00       113         82  112/82
8        22.00       121         93  123/93
9        12.00       118         81  118/81
10       12.00       120         86  120/86

Últimos10 registros

tail(datos, 10)
    temperatura sistolica diastolica sis_dis
691       11.00       114         79  114/79
692       12.00       117         82  117/82
693       12.00       117         83  117/83
694       14.81       117         82  117/82
695       17.45       117         85  117/85
696       19.00       119         89  119/89
697       12.00       116         81  116/81
698       12.00       115         76  115/76
699       12.00       115         80  115/80
700       19.80       111         73  111/73

Modelo Regresión Lineal Simple

modelo <- lm(data = datos, 
             formula = sistolica ~ temperatura)

Resumen del modelo

resumen <- summary(modelo)
resumen

Call:
lm(formula = sistolica ~ temperatura, data = datos)

Residuals:
     Min       1Q   Median       3Q      Max 
-11.1002  -1.8937  -0.0009   2.3157  12.5237 

Coefficients:
             Estimate Std. Error t value            Pr(>|t|)    
(Intercept) 105.17964    0.40632  258.86 <0.0000000000000002 ***
temperatura   0.79205    0.02691   29.43 <0.0000000000000002 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 3.343 on 698 degrees of freedom
Multiple R-squared:  0.5537,    Adjusted R-squared:  0.5531 
F-statistic: 866.1 on 1 and 698 DF,  p-value: < 0.00000000000000022

Los coeficientes a y b

resumen$coefficients[1]  # Valor a
[1] 105.1796
resumen$coefficients[2]  # Valor b
[1] 0.7920548

\[ Y = 105.1796 +0.7920 \cdot x_i \]

Correlación al cuadrado R Square

R Squared significa que la temperatura representa y explican aproximadamente el 55% a la variable presión sistólica.

r2 <- resumen$r.squared
r2
[1] 0.5537247

Y las predicciones con el modelo

prediccion <- predict(object = modelo, newdata = data.frame(temperatura = c(28.5)))
paste("Para una persona que se toma la presión en una temperatur abiente de 28.5 grados, la predicción sería ", round(prediccion), "de presión arterial")
[1] "Para una persona que se toma la presión en una temperatur abiente de 28.5 grados, la predicción sería  128 de presión arterial"

Linea de tendencia

f_linea_tendencia_reg_lineal(datos, modelo)

Referencias consultadas

https://www.nia.nih.gov/espanol/presion-arterial-alta#que

https://www.goredforwomen.org/es/health-topics/high-blood-pressure/understanding-blood-pressure-readings