2014-11-02

Regresión lineal simple para principiantes en R

Title La regresión lineal simple sirve para evaluar la relación entre dos variables, una variable independiente X o predictora y una variable dependiente o explicada Y. Se trata de encontrar una ecuación lineal con fines predictivos.

Datos

Como ejemplo, usamos los datos cats del peso corporal y del corazón de una muestra gatos machos y hembras del paquete MASS en R.

install.packages("MASS") # Si no está instalado
library(MASS)
str(cats)
summary(cats)
str(cats)
'data.frame': 144 obs. of  3 variables:
 $ Sex: Factor w/ 2 levels "F","M": 1 1 1 1 1 1 1 1 1 1 ...
 $ Bwt: num  2 2 2 2.1 2.1 2.1 2.1 2.1 2.1 2.1 ...
 $ Hwt: num  7 7.4 9.5 7.2 7.3 7.6 8.1 8.2 8.3 8.5 ...
Sex - sexo - factor con los niveles hembras "F" y machos "M"
Bwt - Body Weight, peso corporal
Hwt - Heart Weight, peso del corazón

summary(cats)
 Sex         Bwt             Hwt       
 F:47   Min.   :2.000   Min.   : 6.30  
 M:97   1st Qu.:2.300   1st Qu.: 8.95  
        Median :2.700   Median :10.10  
        Mean   :2.724   Mean   :10.63  
        3rd Qu.:3.025   3rd Qu.:12.12  
        Max.   :3.900   Max.   :20.50 

Diagrama de dispersión

with(cats, plot(Hwt ~ Bwt)) # Alternativa 1
plot(cats$Bwt, cats$Hwt, xlab = "Bwt", ylab = "Hwt") # Alternativa 2
plot(Hwt ~ Bwt, cats)  # Alternativa 3

Recta de regresión y R²

reglineal <- lm(cats$Hwt ~ cats$Bwt) # Alternativa 1
reglineal <- lm(Hwt ~ Bwt, cats) # Alternativa 2
abline(reglineal, col = "red") # Añadimos recta de regresión
# Pendiente e intersección
reglineal
   # Alternativas:
  reglineal[[1]]
  summary(reglineal)$coef[, 1]
  reglineal$coef
Call:
lm(formula = cats$Hwt ~ cats$Bwt)

Coefficients:
(Intercept)     cats$Bwt  
    -0.3567       4.0341  
(Intercept) - b, intersección Y
cats$Bwt - m, pendiente

Más información:

summary(reglineal)
 Call:
lm(formula = cats$Hwt ~ cats$Bwt)

Residuals:
    Min      1Q  Median      3Q     Max 
-3.5694 -0.9634 -0.0921  1.0426  5.1238 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  -0.3567     0.6923  -0.515    0.607    
cats$Bwt      4.0341     0.2503  16.119   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1.452 on 142 degrees of freedom
Multiple R-squared:  0.6466, Adjusted R-squared:  0.6441 
F-statistic: 259.8 on 1 and 142 DF,  p-value: < 2.2e-16

Aplicación del modelo

Con la ecuación de la recta de regresión podemos calcular el valor de la variable dependiente Y introduciendo un valor de la variable independiente X en la misma: y = mx + b

Accedemos a la pendiente y la intersección en Y:

# Intersección
  # coef o coefficients son intercambiables
summary(reglineal)$coef[1, 1]
reglineal$coef[1]  
coef(reglineal)[1] # Sintaxis recomendada
(Intercept) 
 -0.3566624 
# Pendiente
summary(reglineal)$coef[2, 1]
reglineal$coef[2] 
coef(reglineal)[2] 
cats$Bwt 
4.034063

Ejemplos:

Si un gato pesa 5 Kg, ¿cuál es el peso estimado de su corazón?

# Gato de 5kg
pesocorazon <- 5*coef(reglineal)[2]+coef(reglineal)[1] 
pesocorazon
     Bwt 
19.81365 
Si un gato pesa 3 Kg, ¿cuál es el peso estimado de su corazón?

# Gato de 3kg
pesocorazon <- 3*coef(reglineal)[2]+coef(reglineal)[1] 
pesocorazon
     Bwt 
11.74553 

Función

Creamos una sencilla función que nos pregunte el peso del gato en la consola y calcule el peso estimado de su corazón.

fun <- function(){
  x1 <- as.numeric(readline("¿Cuál es peso del gato en kg?"))
    # Check if is NA instead of lenght >1 as we did with  
  if (is.na(x1))  {
    x1 <- 0
  }
  reglineal <- lm(cats$Hwt ~ cats$Bwt)
  pesocorazon <- x1*coef(reglineal)[2]+coef(reglineal)[1]
  print(c("El peso estimado del corazón en gramos es:", 
          round(unname(pesocorazon), 5)), quote = FALSE)
}
¿Cuál es peso del gato en kg?3
[1] El peso estimado del corazón en gramos es:
[2] 11.74553  

Bondad del modelo

El Coeficiente de correlación de Pearson r, nos indica el grado de correlación lineal entre la dos variables. Es la covarianza dividida por el producto de las desviaciones típicas de las dos variables

    -1 - correlación negativa perfecta
    0 - no existe relación lineal
    1 - correlación positiva perfecta

# Coeficiente de correlación de Pearson
cor(cats$Bwt, cats$Hwt)
[1] 0.8041274
Como es próximo a 1, concluimos que existe una correlación lineal positiva entre ambas variables.

El coeficiente de determinación R², nos informa de la bondad del ajuste del modelo. Se calcula elevando al cuadrado el coeficiente de correlación de Pearson. Varía entre 0 y 1. Podemos acceder a él mediante la función summary.lm, como hicimos anteriormente.

    0 - las variables son independientes
    1 - existe una relación perfecta entre las variables

# Coeficiente de determinación
cor(cats$Bwt, cats$Hwt)^2
summary(reglineal)$r.squared  # Mediante summary.lm
[1] 0.6466209
En nuestro ejemplo es 0,6466. Indica que conociendo el peso de un gato mejoramos un 64,66% nuestra estimación del peso del corazón, si usamos nuestro modelo en lugar del peso medio del corazón de un gato.

Referencias

No hay comentarios:

Publicar un comentario

Nube de datos