PARTE 1
CORRELACIÓN DE PEARSON AND SPEARMAN
INTRODUCCIÓN
En ocasiones nos puede interesar estudiar si existe o no algún tipo de relación entre dos variables aleatorias. Las relaciones o asociaciones de este tipo entre variables se denominan correlaciones; y están medidas en escalas ordinales o de intervalos. En particular, nos interesa cuantificar la intensidad de la relación lineal entre dos variables.
Cuando el aumento de una de las variables viene acompañado del aumento de la otra, se trata de una correlación positiva o directa. La superficie de un bosque y el número de nidos en él están correlacionados positivamente. Si el aumento de una variable viene acompañado de una disminución en la otra, la correlación es negativa o inversa.
El hecho de que dos variables estén correlacionadas no quiere decir que una sea la causante de la otra dos variables pueden estar independientemente relacionadas con una tercera (quizás no identificada).
Es importante notar que la existencia de correlación entre variables no implica causalidad.
Una correlación perfecta se dá cuando todos los puntos de un diagrama de dispersión forman una linea recta perfecta. Estas correlaciones perfectas (positivas o negativas) prácticamente no existen en biología; suelen ser privilegio exclusivo de los físicos.
En lenguaje llano, la palabra “correlación” describe cualquier tipo de relación entre objetos y hechos. No obstante, en estadística tiene un significado más preciso: se refiere a la relación cuantitativa entre dos variables medidas en escalas ordinales o de intervalos.
Los coeficientes de correlación se pueden calcular mediante métodos paramétricos y no paramétricos. Un coeficiente paramétrico es el Coeficiente de Correlación de Pearson, que se usa para observaciones obtenidas sobre una escala de intervalos y esta sujeto a condiciones más restrictivas que las alternativas no paramétricas. De estas, una de las más ampliamente utilizadas es el Coeficiente de Correlación por Rangos de Spearman.
Si no hay correlación de ningún tipo entre dos variable, entonces tampoco habrá correlación lineal, por lo que r = 0. Sin embargo, el que ocurra r = 0 solo nos dice que no hay correlación lineal, pero puede que la haya de otro tipo. Mientras mas cercano a cero la correlación es mas débil.
En ocasiones, una correlación fuerte puede ser considerada como sistemáticamente no significativa, mientras que una débil puede ser sistemáticamente significativa, por lo que debemos resolver esta aparente paradoja (revisar, supuestos, tamaños de muestras, diseño estadístico y poder de la prueba, entre otras).
COEFICIENTE DE CORRELACION DE PEARSON
El Coeficiente de Correlación de Pearson es un estadístico paramétrico cuya aplicación es adecuada cuando las observaciones, de unidades maestreadas aleatoriamente, están medidas en escalas de intervalos. Se asume que ambas variables tienen una distribución aproximadamente normal, o sea, distribución normal bivariante. Esto puede comprobarse mediante un diagrama de dispersión de los datos, puesto que un diagrama de este tipo para datos normales bivariantes presenta un contorno aproximadamente circular o elíptico. El circulo se acerca más a una elipse en tanto r aumenta su valor.
peso <- c(51, 59, 49, 54, 50, 55, 48, 53, 52, 57)
long <- c(33.5, 38, 32, 37.5, 31.5, 33, 31, 36.5, 34, 35)
library(graphics)
pairs(long ~ peso) #permite elaborar un plot de correlacion
Otra forma de hacerlo de una forma elegante es a través del paquete PerformanceAnalytics
library(PerformanceAnalytics)
# Nuestros datos es mejor tenerlos en un data.frame
dat1 <- data.frame(peso, long)
chart.Correlation(dat1)
Cálculo de la correlación:
cor(peso, long) #cor sirve para analizar correlaciones tipo matriz
## [1] 0.7794691
cor.test(peso, long) # cor.test analiza la significancia de la correlacion, utilizando el contraste t-student.
##
## Pearson's product-moment correlation
##
## data: peso and long
## t = 3.5194, df = 8, p-value = 0.007853
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.2942560 0.9452104
## sample estimates:
## cor
## 0.7794691
Antes de continuar, para saber que tipo correlación aplicar es importante revisar los supuestos de las pruebas.
shapiro.test(peso)
##
## Shapiro-Wilk normality test
##
## data: peso
## W = 0.97343, p-value = 0.9207
shapiro.test(long)
##
## Shapiro-Wilk normality test
##
## data: long
## W = 0.93757, p-value = 0.5263
Ambas variables presentan una distribución normal, por lo que Pearson es la prueba adecuada para nuestros datos.
COEFICIENTE DE DETERMINACION R2
Una pregunta importante que se plantea en el análisis de regresión es la siguiente: Que porcentaje de la variación total en Y se debe a la variación en X? En otras palabras, cual es la proporción de la variación total en Y que puede ser explicada por la variación en X?
El cuadrado del coeficiente de correlación de Pearson es, en si mismo, un estadístico de gran utilidad denominado coeficiente de determinación. Es una medida de la proporción de la variabilidad en una variable, atribuible a la variabilidad de la otra. En una correlación perfecta donde r = +1 o -1, la variación de variable se corresponde con una variación exacta en el valor de la otra. Esta situación no se suele dar en biología, puesto que son muchos los factores que, por lo general, regulan las relaciones entre variables entre organismos.
En el ejemplo anterior el coeficiente de determinación es 0.6075721 = 0,60.75 o 60.75%, de lo que se deduce que aproximadamente el 40% del peso de las aves no esta relacionado con la longitud del pico.
0.7794691^2
## [1] 0.6075721
COEFICIENTE DE CORRELACION POR RANGOS DE SPEARMAN
Cuando exista alguna duda acerca de si se cumplen las relativamente rigurosas premisas para la aplicación del coeficiente de correlación de Pearson, entonces debemos considerar el uso de alguna alternativa no paramétrica.
Esta prueba estadística permite medir la correlación o asociación de dos variables y es aplicable cuando las mediciones se realizan en una escala ordinal, aprovechando la clasificación por rangos.
El coeficiente de correlación de Spearman se rige por las reglas de la correlación simple de Pearson, y las mediciones de este indice corresponden de + 1 a - 1, pasando por el cero, donde este ultimo significa no correlación entre las variables estudiadas, mientras que los dos primeros denotan la correlación máxima.
x <- c(44.4, 45.9, 41.9, 53.3, 44.7, 44.1, 40.7, 45.2, 60.1)
y <- c(2.6, 3.1, 2.5, 3, 3.6, 4, 3.2, 2.8, 3.8)
shapiro.test(x)
##
## Shapiro-Wilk normality test
##
## data: x
## W = 0.80304, p-value = 0.02212
shapiro.test(y)
##
## Shapiro-Wilk normality test
##
## data: y
## W = 0.94856, p-value = 0.6743
Una de las dos variables es asimétrica, por lo que tendremos que utilizar una correlación no paramétrica de Spearman
cor(x, y, method = "spearman")
## [1] 0.1666667
cor.test(x, y, method = "spearman")
##
## Spearman's rank correlation rho
##
## data: x and y
## S = 100, p-value = 0.6777
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
## rho
## 0.1666667
revise los argumentos de esas pruebas , ?cor.test.
Utilice la base de datos “women”. Que tipo de correlacion debe aplicar para mostrar si existe una asociacion entre la altura (height) y el peso (weight)
data(women)
head(women)
## height weight
## 1 58 115
## 2 59 117
## 3 60 120
## 4 61 123
## 5 62 126
## 6 63 129
Se recomienda dar un vista al paquete “corrplot”, dado que permite ejecutar gráficas y correlaciones muy elegantes para ser usadas en publicación o presentaciones de sus trabajos. Además de que permite al lector hacer una lectura rápida del comportamiento de las variables en cuanto a su asociación.
FUNCIONES GRÁFICAS USANDO “corrplot”
library(corrplot)
## corrplot 0.92 loaded
data(mtcars)
head(mtcars)
## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
## Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
## Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
## Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
## Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
## Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
M <- cor(mtcars) #permite ejecutar una matriz de correlación
Aplicación gráfica
corrplot(M, method = "ellipse")
# Visualice otros metodos gráficos como, 'circle', 'square', 'ellipse',
# 'number', 'shade', 'color', 'pie',
PARTE 2
ANÁLISIS DE REGRESIÓN LINEAL SIMPLE
INTRODUCCIÓN
El Análisis de Regresión se usa cuando el investigador sabe que existe una relación entre las variables porque hay una teoría o investigaciones previas que la han descubierto. Por ejemplo, la relación entre espacio y tiempo ya se sabe que es la velocidad, o como la relación entre voltaje e intensidad de corriente eléctrica. En estos casos, el investigador suele estar interesado en verificar experimentalmente tal relación y el objeto de la regresión es encontrar la curva que mejor ajuste a sus datos experimentales.
Utilizando un diagrama de dispersión de puntos podemos resaltar las características de dos variables relacionadas, la linea que se genera denomina linea de mejor ajuste.
SUPUESTOS DEL MODELO DE REGRESION LINEAL
EJEMPLO
peso <- c(61, 60, 78, 62, 66, 60, 54, 84, 68)
altura <- c(162, 154, 180, 158, 171, 169, 166, 176, 163)
ej1 <- data.frame(peso, altura)
reg1 <- lm(peso ~ altura, data = ej1)
summary(reg1)
##
## Call:
## lm(formula = peso ~ altura, data = ej1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -11.444 -3.447 1.347 4.164 10.549
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -67.4679 51.1995 -1.318 0.229
## altura 0.8007 0.3071 2.608 0.035 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 7.268 on 7 degrees of freedom
## Multiple R-squared: 0.4927, Adjusted R-squared: 0.4203
## F-statistic: 6.799 on 1 and 7 DF, p-value: 0.03504
anova(reg1)
## Analysis of Variance Table
##
## Response: peso
## Df Sum Sq Mean Sq F value Pr(>F)
## altura 1 359.15 359.15 6.7994 0.03504 *
## Residuals 7 369.74 52.82
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Observar que el anova es significativo. Muy importante tener este resultado en las pruebas de la regresión, dado que esto se ajusta a lo que buscamos en la hipótesis de la regresión.
Ho = pendientes es igual a cero
H1 = pendientes es diferente a cero
VERIFICACIÓN DE SUPUESTOS
par(mfrow = c(2, 2))
plot(reg1)
# Residual vs Fitted: Deberia estar distribuidos aleatoriamente alrededor de
# la linea horizontal que representa un error residual de cero
# Normal Q-Q: deberia sugerir que los errores residuales se distribuyen
# normalmente.
# Scale-Location Muestra la raiz cuadrada de los residuos estandarizados,
# como una funcion de los valores ajustados. No deberia existir una
# tendencia clara en ese trama.
# Residual vs Leverage Las distancias mas grandes que 1 son sospechosos y
# sugieren la presencia de un valor atipico posible. y su eliminacion podria
# tener efectos sobre la regresion.
FUNCIONES GRÁFICAS USANDO “visreg” AND “ggplot2”
Exploraremos el uso de dos paquetes visreg y ggplot2 para traficar. Usted decide cual es su preferido.
library(visreg)
# Notese que solo requiere incluir la variable independiente, para graficar.
visreg(reg1, "altura", partial = F) #reg1 es nuestro vector que contiene la ecuacion de regresion.
# Nos brinda una resumen de la regresion
summary(reg1)
##
## Call:
## lm(formula = peso ~ altura, data = ej1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -11.444 -3.447 1.347 4.164 10.549
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -67.4679 51.1995 -1.318 0.229
## altura 0.8007 0.3071 2.608 0.035 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 7.268 on 7 degrees of freedom
## Multiple R-squared: 0.4927, Adjusted R-squared: 0.4203
## F-statistic: 6.799 on 1 and 7 DF, p-value: 0.03504
Los valores que debemos interpretar del summary son:
La ecuación de predicción obtenida por la regresión sería:
peso = -67.4679 + 0.8007 * altura
INTEPRETACIÓN DE RESULTADOS
En promedio, cada incremento en una unidad de la altura, corresponde a un incremento del peso de 0.80 kg, asi mismo que una persona cuyo peso sea de cero (origen de y), tenga una altura de -67.46, esto obviamente no parece posible. Dado que la regresion estima como logramos ver, estimaciones mas alla de los valores observados.
#Otra forma grafica con ggplot2
library(ggplot2)#ggplot2 es una extension poderosa para graficar
ggplot(ej1, aes(x=altura, y=peso)) +
geom_point(shape=1) + # genera circulos en el grafico
geom_smooth(method=lm) # adjunta la linea de regresion por defecto es al 95% de confianza
## `geom_smooth()` using formula = 'y ~ x'
PRUEBA SOBRE LOS RESIDUOS
shapiro.test(resid(reg1)) #Normalidad
##
## Shapiro-Wilk normality test
##
## data: resid(reg1)
## W = 0.97706, p-value = 0.9475
library(car)
## Cargando paquete requerido: carData
ncvTest(reg1) #Prueba de heterocedasticidad, Ho=varianzas son constantes
## Non-constant Variance Score Test
## Variance formula: ~ fitted.values
## Chisquare = 0.3545291, Df = 1, p = 0.55156
Revisar el vídeo tutorial de Regresión Lineal Simple (Dar clip)
PARTE 3
ANÁLISIS DE REGRESIÓN LINEAL MÚLTIPLE
INTRODUCCIÓN
En ocasiones tenemos una variable respuesta “dependiente” (Y) de un múltiples variables predictorias o independiente (X1, X2, X3, …,Xi). En esta circustancia, un analisis de regresión lineal múltiple podría determinar un modelo de la relación de las variable respuesta con las variable regresoras. En este tipo de modelos es importante probar la normalidad de residuos, heterocedasticidad y multicolinealidad.
A continuación de desarrolla un ejemplo de regresión múltiple:
Usaremos los datos de Prestige desde la library (car)
library(car)
data(Prestige)
head(Prestige)
## education income women prestige census type
## gov.administrators 13.11 12351 11.16 68.8 1113 prof
## general.managers 12.26 25879 4.02 69.1 1130 prof
## accountants 12.77 9271 15.70 63.4 1171 prof
## purchasing.officers 11.42 8865 9.11 56.8 1175 prof
## chemists 14.62 8403 11.68 73.5 2111 prof
## physicists 15.64 11030 5.13 77.6 2113 prof
names(Prestige)
## [1] "education" "income" "women" "prestige" "census" "type"
Generamos un modelo de regresion multiple (variables independientes)
reg2 <- lm(prestige ~ education + women, data = Prestige)
summary(reg2)
##
## Call:
## lm(formula = prestige ~ education + women, data = Prestige)
##
## Residuals:
## Min 1Q Median 3Q Max
## -28.010 -4.069 1.050 5.027 18.942
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -8.75416 3.54213 -2.471 0.015164 *
## education 5.42780 0.31612 17.170 < 2e-16 ***
## women -0.09305 0.02719 -3.422 0.000904 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 8.652 on 99 degrees of freedom
## Multiple R-squared: 0.7521, Adjusted R-squared: 0.7471
## F-statistic: 150.2 on 2 and 99 DF, p-value: < 2.2e-16
Revisamos el modelo
anova(reg2)
## Analysis of Variance Table
##
## Response: prestige
## Df Sum Sq Mean Sq F value Pr(>F)
## education 1 21608.4 21608.4 288.685 < 2.2e-16 ***
## women 1 876.7 876.7 11.713 0.0009039 ***
## Residuals 99 7410.3 74.9
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Verificamos los supuestos gráficamente
par(mfrow = c(2, 2))
plot(reg2)
Distribucion de los residuos
shapiro.test(residuals(reg2))
##
## Shapiro-Wilk normality test
##
## data: residuals(reg2)
## W = 0.98367, p-value = 0.2419
Gráfico con el paquete visreg
library(visreg)
visreg(reg2, "education", partial = F)
visreg(reg2, "women", partial = F)
Gráfico con el paquete ggplot2
#para la variable women
library(ggplot2)
ggplot(Prestige, aes(x=women, y=prestige)) +
geom_point(shape=1) + # genera circulos en el grafico
geom_smooth(method=lm) # adjunta la linea de regresion por defecto es al 95% de confianza
## `geom_smooth()` using formula = 'y ~ x'
#para la variable education
library(ggplot2)
ggplot(Prestige, aes(x=education, y=prestige)) +
geom_point(shape=1) + # genera circulos en el grafico
geom_smooth(method=lm) # adjunta la linea de regresion por defecto es al 95% de confianza
## `geom_smooth()` using formula = 'y ~ x'
#Figura con lineas suavizadas
library(ggplot2)
par(mfrow=c(1,2))
ggplot(Prestige, aes(x=women, y=prestige)) +
geom_point(shape=1) + # genera circulos en el grafico
geom_smooth() # adjunta la linea de regresion por defecto es al 95% de confianza, de forma suavizada.
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
ggplot(Prestige, aes(x=income, y=prestige)) +
geom_point(shape=1) + # genera circulos en el grafico
geom_smooth() # adjunta la linea de regresion por defecto es al 95% de confianza, de forma suavizada.
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
# Generamos un segundo modelo de regresion multiple, incluyendo una variable
# adicional (income) al modelo
reg3 <- lm(prestige ~ education + women + income, data = Prestige)
# Revisamos todo lo aprendido
summary(reg3)
##
## Call:
## lm(formula = prestige ~ education + women + income, data = Prestige)
##
## Residuals:
## Min 1Q Median 3Q Max
## -19.8246 -5.3332 -0.1364 5.1587 17.5045
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6.7943342 3.2390886 -2.098 0.0385 *
## education 4.1866373 0.3887013 10.771 < 2e-16 ***
## women -0.0089052 0.0304071 -0.293 0.7702
## income 0.0013136 0.0002778 4.729 7.58e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 7.846 on 98 degrees of freedom
## Multiple R-squared: 0.7982, Adjusted R-squared: 0.792
## F-statistic: 129.2 on 3 and 98 DF, p-value: < 2.2e-16
anova(reg3)
## Analysis of Variance Table
##
## Response: prestige
## Df Sum Sq Mean Sq F value Pr(>F)
## education 1 21608.4 21608.4 350.974 < 2.2e-16 ***
## women 1 876.7 876.7 14.240 0.0002757 ***
## income 1 1376.7 1376.7 22.361 7.579e-06 ***
## Residuals 98 6033.6 61.6
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
par(mfrow = c(2, 2))
plot(reg3)
shapiro.test(residuals(reg3))
##
## Shapiro-Wilk normality test
##
## data: residuals(reg3)
## W = 0.99363, p-value = 0.918
library(visreg)
visreg(reg3, "income", partial = F)
¿Cuál modelos es el mejor?
AIC(reg2, reg3)
## df AIC
## reg2 4 734.5998
## reg3 5 715.6358
Buscamos las variables influyentes en el modelo. El siguiente script nos premite ver las variables que afectan el modelo de regresion.
avPlots(reg2, id.n = 2, id.cex = 0.7)
avPlots(reg3, id.n = 2, id.cex = 0.7)
Revisar el vídeo tutorial ¿Como eliminar datos de un data.frame (matriz de datos) en R?(Dar clip)
Outlier dentro del modelo de regresión lineal
# Outlier, nos permite identificar los valores extremos.
outlierTest(reg2)
## No Studentized residuals with Bonferroni p < 0.05
## Largest |rstudent|:
## rstudent unadjusted p-value Bonferroni p
## newsboys -3.437184 0.00086402 0.08813
qqPlot(reg2, id.n = 3)
## newsboys service.station.attendant
## 53 54
outlierTest(reg3)
## No Studentized residuals with Bonferroni p < 0.05
## Largest |rstudent|:
## rstudent unadjusted p-value Bonferroni p
## newsboys -2.694442 0.0083101 0.84763
qqPlot(reg3, id.n = 3)
## newsboys farmers
## 53 67
Supuesto de heretocesdasticidad
ncvTest(reg3) # H0= varianza constante.
## Non-constant Variance Score Test
## Variance formula: ~ fitted.values
## Chisquare = 0.2490143, Df = 1, p = 0.61777
Supuesto de multicolineariedad
vif(reg3) #valores >4 sugieren multicolineariedad
## education women income
## 1.845165 1.526593 2.282038
Ejemplo de regresiones lineales múltiples
Utilizaremos la base de datos “trees”. Observe que la base de datos es interactiva, para visualizar la cantidad de datos que usted requiera.
library(DT)
datatable(trees)
Recomiendo hacer inspección básica, por ejemplo, revisar el supuesto de que las variables se ajustan a un modelo de regresión lineal.
library(car)
scatterplotMatrix(trees)
Note que Volume y Height pareciera no ajustarse de manera lineal
Modelo de regresión
reg1 <- lm(Volume ~ Height + Girth, data=trees)
summary(reg1)
##
## Call:
## lm(formula = Volume ~ Height + Girth, data = trees)
##
## Residuals:
## Min 1Q Median 3Q Max
## -6.4065 -2.6493 -0.2876 2.2003 8.4847
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -57.9877 8.6382 -6.713 2.75e-07 ***
## Height 0.3393 0.1302 2.607 0.0145 *
## Girth 4.7082 0.2643 17.816 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 3.882 on 28 degrees of freedom
## Multiple R-squared: 0.948, Adjusted R-squared: 0.9442
## F-statistic: 255 on 2 and 28 DF, p-value: < 2.2e-16
Revisamos los supuestos
par(mfrow=c(2,2))
plot(reg1)
Parece haber ciertos problemas en el cumplimiento de los supuestos!
El primer gráfico enfrenta los errores residuales frente a sus valores ajustados. Los residuos deben estar distribuidos al azar alrededor de la línea horizontal que representa un error residual de cero; es decir, no debe haber una tendencia clara en la distribución de puntos. Una tendencia en la variabilidad de los residuos sugiere que la varianza está relacionada con la media, violando el supuesto de varianza constante. Si el gráfico tiene forma de embudo, es decir, si los puntos parecen estar más o menos extendidos a lo largo del gráfico, entonces lo más probable es que exista heterocedastididad en los datos Así mismo, si se presentan agrupados los residuos, es posible que la aleatoriedad no se cumpla.
El segundo gráfico:residuos tipificados se trazan contra los cuantiles de una distribución normal estándar. Si los residuos se distribuyen normalmente los datos se deben situarse a lo largo de la línea.
El tercer gráfico:escala-ubicación en el que los residuos están estandarizados por sus desviaciones estándar estimadas. Esta gráfica se utiliza para detectar si la difusión de los residuos es constante en el rango de valores ajustados. Por lo tanto una variación de la tendencia, es que existen valores altos muestran una gran variación, y se puede traducir como el no cumplimiento de la homogeneidad de las varianzas
El cuarto gráfico:muestra el valor leverage de cada punto, que se relaciona con la medida de su importancia en la determinación del modelo de regresión. Están representados los datos que ejercen mayor influencia.
A veces es bueno correr algunas pruebas alrternativas para identificar esos valores influyentes de la regresión: Ejm
library(car)
influencePlot(reg1, id.n = 2)
## StudRes Hat CookD
## 18 -1.859901 0.1434615 0.1775359
## 20 -1.105744 0.2112366 0.1082855
## 31 2.765603 0.2270585 0.6052326
Observe que los valores son la posición dentro de los datos
De momento nos queda primeramente solucionar el cumplimeinto de los supuestos.
Por lo que ejecutaremos una transformación de los datos.
reg2 <- lm(log(Volume) ~ log(Height) + log(Girth), data=trees)
summary(reg2)
##
## Call:
## lm(formula = log(Volume) ~ log(Height) + log(Girth), data = trees)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.168561 -0.048488 0.002431 0.063637 0.129223
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6.63162 0.79979 -8.292 5.06e-09 ***
## log(Height) 1.11712 0.20444 5.464 7.81e-06 ***
## log(Girth) 1.98265 0.07501 26.432 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.08139 on 28 degrees of freedom
## Multiple R-squared: 0.9777, Adjusted R-squared: 0.9761
## F-statistic: 613.2 on 2 and 28 DF, p-value: < 2.2e-16
par(mfrow=c(2,2))
plot(reg2)
Note como mejoran los supuestos
library(visreg)
par(mfrow=c(2,2))
visreg(reg2)
Forma la parte gráfica intereactiva en ggplot (se requieren de ciertos paquetes)
library(ggplot2)#ggplot2 es una extension poderosa para graficar
plot1<-ggplot(trees, aes(x=log(Height), y=log(Volume))) +
geom_point(shape=1) + # genera circulos en el grafico
geom_smooth(method=lm)
library(plotly)
ggplotly(plot1) # Make the plot interactive
Buscando valores influyentes
library(car)
avPlots(reg2, id.n=2, id.cex=0.7)
Identificamos valores extremos
outlierTest(reg2)
## No Studentized residuals with Bonferroni p < 0.05
## Largest |rstudent|:
## rstudent unadjusted p-value Bonferroni p
## 18 -2.32572 0.027789 0.86146
Extraemos el valor extremos y probamos un nuevo modelo
trees1<-trees[-c(3,15,17,18,20),]
trees1
## Girth Height Volume
## 1 8.3 70 10.3
## 2 8.6 65 10.3
## 4 10.5 72 16.4
## 5 10.7 81 18.8
## 6 10.8 83 19.7
## 7 11.0 66 15.6
## 8 11.0 75 18.2
## 9 11.1 80 22.6
## 10 11.2 75 19.9
## 11 11.3 79 24.2
## 12 11.4 76 21.0
## 13 11.4 76 21.4
## 14 11.7 69 21.3
## 16 12.9 74 22.2
## 19 13.7 71 25.7
## 21 14.0 78 34.5
## 22 14.2 80 31.7
## 23 14.5 74 36.3
## 24 16.0 72 38.3
## 25 16.3 77 42.6
## 26 17.3 81 55.4
## 27 17.5 82 55.7
## 28 17.9 80 58.3
## 29 18.0 80 51.5
## 30 18.0 80 51.0
## 31 20.6 87 77.0
reg3 <- lm(log(Volume) ~ log(Height) + log(Girth), data=trees1)
summary(reg3)
##
## Call:
## lm(formula = log(Volume) ~ log(Height) + log(Girth), data = trees1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.152211 -0.057899 0.001432 0.059596 0.115497
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6.95432 0.95074 -7.315 1.92e-07 ***
## log(Height) 1.20408 0.24134 4.989 4.79e-05 ***
## log(Girth) 1.96470 0.07111 27.630 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.07021 on 23 degrees of freedom
## Multiple R-squared: 0.9842, Adjusted R-squared: 0.9829
## F-statistic: 718.1 on 2 and 23 DF, p-value: < 2.2e-16
par(mfrow=c(2,2))
plot(reg3)
Nota: no se recomienda hacer más de una extracción al modelo
Comparación de los modelos
AIC(reg2,reg3) #El modelo reg1, fue descartado por incumplir supuestos, sin embargo hay que ponerle atención a la advertencia, que es un error muy clásico en la comparación de modelos.
## Warning in AIC.default(reg2, reg3): No todos los modelos se han ajustado usando
## el mismo número de observaciones
## df AIC
## reg2 4 -62.71125
## reg3 4 -59.53002
Revisión de Supuestos con cálculos estadísticos
Normalidad
shapiro.test(residuals(reg2))
##
## Shapiro-Wilk normality test
##
## data: residuals(reg2)
## W = 0.95922, p-value = 0.2782
Homogeneidad de las varianzas
library(car)
ncvTest(reg2)
## Non-constant Variance Score Test
## Variance formula: ~ fitted.values
## Chisquare = 0.2266356, Df = 1, p = 0.63403
Explicación
summary(reg2)
##
## Call:
## lm(formula = log(Volume) ~ log(Height) + log(Girth), data = trees)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.168561 -0.048488 0.002431 0.063637 0.129223
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6.63162 0.79979 -8.292 5.06e-09 ***
## log(Height) 1.11712 0.20444 5.464 7.81e-06 ***
## log(Girth) 1.98265 0.07501 26.432 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.08139 on 28 degrees of freedom
## Multiple R-squared: 0.9777, Adjusted R-squared: 0.9761
## F-statistic: 613.2 on 2 and 28 DF, p-value: < 2.2e-16
Observemos el Adjusted R-squared:0.98, que mide la variabilidad de los datos explicada por el modelo. En nuestro caso decir que el 98% de la variabilidad de los datos fue recogida por el modelo, en otras palabras el modelo es bueno, además de ser significativo.
Así mismo la ecuación de la regresión múltiple quedaría escrita de la siguiente manera:
log(Volumen)= -6.63162 + (log(Height) * (1.11712)) + (log(Girth) * (1.98265))
Por lo que si quisieramos hacer una predicción, sustituimos los valores en la ecuación.
Vamos a predecir por ejemplo, cuando la atura de un árbol es de 65 y el “girth” de 10.
(-6.63162)+(log(65)*1.11712) + (log(10)*1.98265)
## [1] 2.596892
Por lo que el valor esperado del volumen sería “2.596892”. Note que este valor está basado en la transformación logaritmica, y para transformarlo a su escala original, invertimos el logaritmo aplicando “exp” (función exponencial)
exp(2.596892)
## [1] 13.42196
Por lo que 13.421 sería el valor en las unidades originales en las que se encuentran los datos.
La forma correcta de aplicar la predicción en R es utilizando la función “predict.lm” y como nuestro modelo es bueno para predecir, aplicamos para un un conjunto los valores los siguiente.
predict.lm(reg2,data.frame(Height=c(65,72,75,90), Girth=c(10,15,20,25)))
## 1 2 3 4
## 2.596908 3.515062 4.131038 4.777129
Ahora utilizaremos la base de datos “mtcars”
a) Genere un modelo de regresión utilizando únicamente las filas 1:15
data.frame(mtcars)
## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
## Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
## Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
## Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
## Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
## Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
## Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
## Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
## Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
## Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
## Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4
## Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3
## Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3
## Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3
## Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4
## Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4
## Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4
## Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
## Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
## Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
## Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
## Dodge Challenger 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2
## AMC Javelin 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2
## Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4
## Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2
## Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
## Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
## Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
## Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4
## Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6
## Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8
## Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2
pairs(mtcars,pch=8)
b) Genere su modelo de regresión utilizando como variable dependiente a “mpg” y como varibles independientes a “hp+wt”.
Con esto, vamos a explicar el consumo (mpg) en función de la potencia (hp) y del peso (wt):
##
## Call:
## lm(formula = mpg ~ hp + wt, data = mtcars2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.9656 -0.9031 -0.1894 0.9988 1.8708
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 33.556402 1.846469 18.173 4.25e-10 ***
## hp -0.040534 0.009174 -4.419 0.000838 ***
## wt -2.668977 0.692562 -3.854 0.002294 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.313 on 12 degrees of freedom
## Multiple R-squared: 0.8929, Adjusted R-squared: 0.8751
## F-statistic: 50.03 on 2 and 12 DF, p-value: 1.507e-06
Esto se interpreta: Cuanto más potente es el coche, menos millas recorre (de ahí el signo negativo de su coeficiente), y cuanto más pesa, menos millas recorre.
El R-squared es del 87.5% , lo que quiere decir que esas dos variables explican bastante bien el consumo.
library(visreg)
visreg(reg1)
c) Predecir, las millas recorridas por galón de un coche que tiene 150 caballos y pesa 2.5 (x 1000 lbs)
## 1
## 20.80379
Interacción
data(mtcars)
reg2<-lm(mpg~hp*wt, data=mtcars)
summary(reg2)
##
## Call:
## lm(formula = mpg ~ hp * wt, data = mtcars)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3.0632 -1.6491 -0.7362 1.4211 4.5513
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 49.80842 3.60516 13.816 5.01e-14 ***
## hp -0.12010 0.02470 -4.863 4.04e-05 ***
## wt -8.21662 1.26971 -6.471 5.20e-07 ***
## hp:wt 0.02785 0.00742 3.753 0.000811 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2.153 on 28 degrees of freedom
## Multiple R-squared: 0.8848, Adjusted R-squared: 0.8724
## F-statistic: 71.66 on 3 and 28 DF, p-value: 2.981e-13
En este caso no hubo un interación significativa, lo que se interpreta que ninguna de las variables independientes se comporta de manera diferente con respecto a las variable dependiente.