Ejemplo Cumpliendo los supuestos

Se crea un ejemplo aleatorio usando una función para después analizar los supuestos de este escenario.

La forma de construir este escenario dará pie a que todos los supuestos se cumplan como se verá a continuación:

gen_dat_multiple <- function(n) {
  varianza <- 16  # Varianza del error
  
  # Generar 3 variables predictoras
  x1 <- runif(n=n, min=-5, max=6)
  x2 <- runif(n=n, min=-8, max=3)
  x3 <- runif(n=n, min=-1, max=10)
  
  # Crear media con relación lineal múltiple
  media <- 4 - 2*x1 + 0.5*x2 + 1.5*x3
  
  # Generar variable respuesta
  y <- rnorm(n=n, mean=media, sd=sqrt(varianza))
  
  # Crear data frame
  marco_datos <- data.frame(y=y, x1=x1, x2=x2, x3=x3)
  return(marco_datos)
}

# Generar datos
datos_multi <- gen_dat_multiple(n=100)
summary(datos_multi)
##        y                 x1                x2                x3         
##  Min.   :-18.467   Min.   :-4.9786   Min.   :-7.8347   Min.   :-0.7848  
##  1st Qu.:  1.485   1st Qu.:-2.4772   1st Qu.:-4.9449   1st Qu.: 1.5455  
##  Median :  7.703   Median : 0.1258   Median :-2.9936   Median : 4.0374  
##  Mean   :  8.010   Mean   : 0.4241   Mean   :-2.7109   Mean   : 4.3767  
##  3rd Qu.: 14.809   3rd Qu.: 3.6385   3rd Qu.:-0.5025   3rd Qu.: 7.6723  
##  Max.   : 31.569   Max.   : 5.9148   Max.   : 2.7988   Max.   : 9.9434
#Mostrar Datos
chart.Correlation(datos_multi, histogram = TRUE)

mat_cor <- cor(datos_multi)
corrplot.mixed(mat_cor)

# Ajustar modelo lineal múltiple
mod_multi <- lm(y ~ x1 + x2 + x3, data=datos_multi)
summary(mod_multi)
## 
## Call:
## lm(formula = y ~ x1 + x2 + x3, data = datos_multi)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -11.4946  -2.3324  -0.1246   2.6832  10.7244 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   3.1394     0.7993   3.928 0.000161 ***
## x1           -1.9444     0.1245 -15.622  < 2e-16 ***
## x2            0.6890     0.1382   4.986 2.74e-06 ***
## x3            1.7280     0.1315  13.140  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 4.224 on 96 degrees of freedom
## Multiple R-squared:  0.8159, Adjusted R-squared:  0.8102 
## F-statistic: 141.8 on 3 and 96 DF,  p-value: < 2.2e-16

Gráficos relacionados a los supuestos de los residuos

Analicemos los sigueintes gráficos:

Media de los residuos igual a 0

mean(mod_multi$residuals)
## [1] 2.454092e-17
t.test(mod_multi$residuals)$p.value
## [1] 1

Con un p-valor >0.05 se concluye que los residuos tienen media igual a 0.

Normalidad de los residuos

shapiro.test(mod_multi$residuals)$p.value
## [1] 0.700143

Con un p-valor >0.05 se concluye que los residuos siguen una distribución normal.

Conclusiones

Como se pudo observar, todos los supuestos se cumplieron con éxito, esto gracias a la forma en que se creó la base datos.

Ejemplo donde se violan los supuestos

Se crea un ejemplo aleatorio usando una función para después analizar los supuestos de este escenario.

La forma de construir este escenario dará pie a que algunos de los supuestos no se cumplan como se verá a continuación:

gen_dat_multiple <- function(n) {
  varianza <- 16  # Varianza del error
  
  # Generar 3 variables predictoras
  x1 <- runif(n=n, min=-5, max=6)
  x2 <- runif(n=n, min=-8, max=3)
  x3 <- runif(n=n, min=-1, max=10)
  
  # Crear media con relación lineal múltiple
  media <- 4 - 2*x1 + 0.5*x2 + 1.5*x3^2
  
  # Generar variable respuesta
  y <- rnorm(n=n, mean=media, sd=sqrt(varianza))
  
  # Crear data frame
  marco_datos <- data.frame(y=y, x1=x1, x2=x2, x3=x3)
  return(marco_datos)
}

# Generar datos
datos_multi <- gen_dat_multiple(n=100)
summary(datos_multi)
##        y                 x1                 x2               x3         
##  Min.   : -9.932   Min.   :-4.95682   Min.   :-7.939   Min.   :-0.7543  
##  1st Qu.: 10.202   1st Qu.:-2.86794   1st Qu.:-5.535   1st Qu.: 1.5354  
##  Median : 28.272   Median : 0.30780   Median :-2.981   Median : 4.1883  
##  Mean   : 44.806   Mean   : 0.08926   Mean   :-2.883   Mean   : 4.3366  
##  3rd Qu.: 81.224   3rd Qu.: 2.85515   3rd Qu.:-0.129   3rd Qu.: 7.0130  
##  Max.   :152.536   Max.   : 5.98878   Max.   : 2.675   Max.   : 9.8396
#Mostrar Datos
chart.Correlation(datos_multi, histogram = TRUE)

mat_cor <- cor(datos_multi)
corrplot.mixed(mat_cor)

# Ajustar modelo lineal múltiple
mod_multi2 <- lm(y ~ x1 + x2 + x3, data=datos_multi)
summary(mod_multi)
## 
## Call:
## lm(formula = y ~ x1 + x2 + x3, data = datos_multi)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -11.4946  -2.3324  -0.1246   2.6832  10.7244 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   3.1394     0.7993   3.928 0.000161 ***
## x1           -1.9444     0.1245 -15.622  < 2e-16 ***
## x2            0.6890     0.1382   4.986 2.74e-06 ***
## x3            1.7280     0.1315  13.140  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 4.224 on 96 degrees of freedom
## Multiple R-squared:  0.8159, Adjusted R-squared:  0.8102 
## F-statistic: 141.8 on 3 and 96 DF,  p-value: < 2.2e-16

Gráficos relacionados a los supuestos de los residuos

Analicemos los sigueintes gráficos:

plot(mod_multi2)

Media de los residuos igual a 0

mean(mod_multi2$residuals)
## [1] -5.035035e-16
t.test(mod_multi2$residuals)$p.value
## [1] 1

Con un p-valor >0.05 se concluye que los residuos tienen media igual a 0.

Normalidad de los residuos

shapiro.test(mod_multi2$residuals)$p.value
## [1] 0.0001056259

Con un p-valor <0.05 se concluye que los residuos no siguen una distribución normal.

Conclusiones

El cambio en la fórmula para definir el valor esperado de la variable respuesta ocasionó los sigueintes problemas:
1) Los residuos tuvieron un patrón asociado a una parábola, cuando deberían no seguir ningún patrón.
2) Los residuos dejaron de seguir una distribución normal.
3) Los residuos no tuvieron varianza constante, esto es heterocedasticidad
El único supuesto que se cumplió fue que la media de los residuos fue igual a 0.