Estadı́stica II Curso 2010/2011 Licenciatura en Matemáticas Práctica 3: Regresión simple con R 1. El fichero de datos Vamos a trabajar con el fichero salinity que se encuentra en el paquete boot. Para cargar el fichero de datos y obtener información sobre sus contenidos: library(boot) data(salinity) help(salinity) attach(salinity) El comando attach sirve para que R reconozca los nombres de las variables sin tener que usar la notación fichero$variable. El fichero tiene 28 observaciones y 4 variables, correspondientes a salinidad del agua y caudal del rı́o en promedios quincenales registrados en Pimlico Sound (Carolina del Norte) en los meses de marzo, abril y mayo de los años 1972-1977: 2. sal Salinidad en promedio quincenal lag Salinidad promedio en la quincena anterior trend Factor 0-6 que indica el periodo dis Caudal del rı́o Análisis descriptivo En primer lugar vamos a describir los datos. Las principales medidas numéricas son: summary(salinity) sal Min. : 4.300 lag Min. : 4.300 trend Min. :0.0 dis Min. :20.77 1st Qu.: 8.075 1st Qu.: 8.075 1st Qu.:1.0 1st Qu.:21.98 Median :11.150 Median :10.650 Median :2.5 Median :22.90 Mean Mean Mean Mean :10.554 :10.332 1 :2.5 :23.73 3rd Qu.:13.025 3rd Qu.:13.025 3rd Qu.:4.0 3rd Qu.:24.86 Max. Max. Max. Max. :15.100 :15.000 :5.0 :33.44 Para captar visualmente las posibles relaciones lineales entre las variables (a excepción del factor trend) podemos representar una matriz de diagramas de dispersión: pairs(salinity[,-3]). El resultado es: 14 ● ● ● ● ● ● ● ● ● ● ● ● ● ● sal ● ●● ●● ● ●●● ● ● ● ● ● ● ● ● ● ● ● 14 12 ● ● ● ● ● ● ●● ●● ● ● ● ● ● ● ● ● ● ● ● 14 ● ● 12 ● 10 ● ●● 8 ●● ● ● ● ● ●● ● ● ● ● ● ●● ● ●● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● 6 8 ● 10 ● ● ● ● ● ●● ● ● ● ● ● 4 30 ● ● ● ● ● ● ● ●● ● ●● ● 12 ● ● dis ● ● ● ● ● ● ● ● ● ●● ●● ● ● 14 ● ● ● ● ● ●● 22 4 ● 26 6 ● ● ● ●● lag ● ● ● ● ● 4 ● ● ● 12 10 10 8 8 6 6 4 ● 22 26 30 Numéricamente, podemos cuantificar el grado de relación lineal mediante la matriz de coeficientes de correlación: cor(salinity[,-3]) sal lag dis sal 1.0000000 0.8715017 -0.4774552 lag 0.8715017 1.0000000 -0.2599139 dis -0.4774552 -0.2599139 3. 1.0000000 Ajuste del modelo de regresión lineal Con el fin de estudiar con mayor profundidad la relación entre la salinidad y el caudal, ajustamos un modelo de regresión simple entre las dos variables: sali = β0 + β1 disi + i , i = 1, . . . , n, donde i ≡ N(0, σ 2 ) independientes. Para ajustar el modelo y obtener un resumen de los resultados basta ejecutar: 2 salinity.lm = lm(sal~dis) summary(salinity.lm) Call: lm(formula = sal ~ dis) Residuals: Min 1Q Median 3Q Max -4.8703 -2.4134 0.8016 1.9248 4.9442 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 22.7739 4.4398 dis -0.5149 0.1858 5.130 2.39e-05 *** -2.771 0.0102 * --Signif. codes: 0 ’***’ 0.001 ’**’ 0.01 ’*’ 0.05 ’.’ 0.1 ’ ’ 1 Residual standard error: 2.695 on 26 degrees of freedom Multiple R-Squared: 0.228, Adjusted R-squared: 0.1983 F-statistic: 7.677 on 1 and 26 DF, p-value: 0.01019 Por ejemplo, el estimador de la pendiente es β̂1 = −0,5149 y es significativamente diferente de cero a nivel α = 0,05. Mediante las funciones genéricas coef (coeficientes), residuals (residuos), fitted (valores ajustados), confint (intervalos de confianza) y anova (tabla de análisis de la varianza) podemos extraer información adicional sobre el ajuste del modelo. Por ejemplo, la tabla de análisis de la varianza se obtiene mediante anova(salinity.lm) Analysis of Variance Table Response: sal Df dis 1 Sum Sq Mean Sq F value 55.771 55.771 Residuals 26 188.878 7.265 Pr(>F) 7.6772 0.01019 * Ejercicios A partir de los resultados anteriores, responde a las preguntas siguientes: 1. ¿Cuál es el valor de la varianza residual s2R ? 2. Calcula un intervalo de confianza de nivel 0.95 para la salinidad esperada cuando el caudal vale 23. 3 3. Calcula un intervalo de predicción de nivel 0.95 para la salinidad si el caudal vale 22. 4. Diagnóstico del modelo Guardamos los residuos del ajuste en el vector residuos mediante el comando residuos = resid(salinity.lm). Guardamos los valores ajustados en el vector ajustados mediante ajustados = fitted(salinity.lm). Los dos gráficos principales para hacer el diagnostico del modelo son el qqplot de los residuos (normalidad) y el gráfico de residuos frente a valores ajustados (homocedasticidad, linealidad). Para obtener ambos simultáneamente podemos usar el siguiente código: # Graficos de residuos layout(matrix(1:2,1)) # QQPlot de residuos qqnorm(residuos) qqline(residuos) # Residuos frente a valores ajustados plot(ajustados,residuos) abline(h=0,lty=2) El resultado es el gráfico siguiente: Normal Q−Q Plot ● ● ● 4 4 ● ● ● ●● ● ● ● ● ● ● ● −2 −2 ● ● ● ●● ● ● ● ● ● ● ● ●● ● −4 ● −4 ● ● 0 residuos ● ● ● ● ● ● −2 ● ● ●● ●● ● ● ● ● ● ● ● 0 Sample Quantiles ● ● 2 2 ● ● −1 0 1 2 6 7 Theoretical Quantiles 8 9 ajustados Ejercicios 1. Demuestra que la varianza de los residuos viene dada por: Var(ei ) = σ 2 (1 − hi ), 4 10 11 12 donde hi = 1/n + (xi − x̄)2 /Sxx . 2. Si se definen los residuos estandarizados como: ri = e √ i , i = 1, . . . , n, sR 1 − hi entonces las variables ri tienen distribución normal estándar. Muchas veces los gráficos de residuos (QQPlot y residuos frente a valores ajustados) se llevan a cabo usando los residuos estandarizados en lugar de los residuos originales. Calcula los residuos estandarizados y representa los gráficos con ellos. ¿Se observa alguna diferencia respecto a los gráficos análogos basados en los residuos no estandarizados? ¿Qué ventaja tienen los residuos estandarizados frente a los no estandarizados? 5. Análisis de influencia Con el fin de detectar qué puntos son potencialmente influyentes en el análisis, vamos a calcular el vector de pesos wi = (xi − x̄)2 /Sxx , i = 1, . . . , n, y a representarlo mediante un diagrama de barras: Sxx = sum((dis-mean(dis))^2) w = (dis-mean(dis))^2/Sxx barplot(w) 0.0 0.1 0.2 0.3 0.4 El resultado es el siguiente gráfico: La observación 16 es la más influyente de acuerdo con la medida anterior. Se puede hacer fácilmente un ajuste excluyendo esta observación gracias a la sintaxis de R: 5 salinity.lm2 <- lm(sal[-16]~dis[-16]) summary(salinity.lm2) Call: lm(formula = sal[-16] ~ dis[-16]) Residuals: Min 1Q Median 3Q Max -3.3417 -2.0565 0.6875 1.1680 5.3322 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 32.9165 5.2599 6.258 1.51e-06 *** dis[-16] -0.9567 0.2242 -4.267 0.000249 *** --Signif. codes: 0 ’***’ 0.001 ’**’ 0.01 ’*’ 0.05 ’.’ 0.1 ’ ’ 1 Residual standard error: 2.379 on 25 degrees of freedom Multiple R-Squared: 0.4214, Adjusted R-squared: 0.3983 F-statistic: 18.21 on 1 and 25 DF, p-value: 0.0002487 El valor estimado de la pendiente ha cambiado bastante, β̂1 = −0,9567, y el p-valor se ha reducido mucho. El coeficiente R2 también ha aumentado. 6. Gráficos Para representar la nube de puntos, junto con las dos rectas estimadas (con y sin la observación 16) se puede utilizar el siguiente código: plot(dis,sal,pch=16,bty=’l’,xlab=’Caudal’,ylab=’Salinidad’) abline(coef(salinity.lm),lwd=2) abline(coef(salinity.lm2),lty=2,lwd=2) legend(dis[16]-1.5,sal[16]-0.5,’obs.16’,bty=’n’,cex=0.8) El resultado es el gráfico siguiente: 6 14 ● ●● 12 ● ● ● ● ● ● ● ● ● ● ● ● ● 10 ● obs.16 ● ● ● 8 Salinidad ● ●● ● 6 ● ● ● 4 ● 22 24 26 28 30 32 Caudal Apéndice: Análisis de la varianza con R En este apartado vamos a estudiar si el caudal del rı́o (variable cuantitativa) depende de la quincena en la que se ha registrado (variable cualitativa). La forma gráfica de captar la posible relación es mediante un diagrama de cajas múltiple: boxplot(dis~ trend) (nótese el uso de la fórmula en el comando boxplot) 22 24 26 28 30 32 ● 0 1 2 3 4 5 Se observa un cambio de nivel en el caudal a partir de la segunda quincena de abril. También vemos que hay un dato atı́pico correspondiente al nivel 1 (segunda quincena de marzo). Probablemente esta observación es la 16 que era tan influyente en el ejemplo anterior. El modelo adecuado para hacer inferencia sobre la posible relación entre las dos variables 7 es un ANOVA de un factor: disij = µ + αi + ij , donde αi es el efecto correspondiente al nivel i del factor trend. Para ajustar el modelo conviene convertir la variable trend en un factor mediante el comando factor. Esto mejora la presentación de la salida. > ftrend <- factor(trend) > ftrend [1] 4 5 0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3 0 1 4 5 0 1 2 3 4 5 Levels: 0 1 2 3 4 5 Ahora ajustamos el modelo, resumimos los resultados y obtenemos los estimadores de los parámetros: > salinity.aov <- aov(dis~ftrend) > summary(salinity.aov) Df ftrend Residuals 5 Sum Sq Mean Sq F value 77.562 15.512 22 132.801 6.036 Pr(>F) 2.5698 0.05622 . --Signif. codes: 0 ’***’ 0.001 ’**’ 0.01 ’*’ 0.05 ’.’ 0.1 ’ ’ 1 > coef(salinity.aov) (Intercept) ftrend1 ftrend2 ftrend3 ftrend4 ftrend5 24.0560 2.0380 1.6515 -1.3985 -2.0920 -1.9540 Las funciones genéricas actúan ahora de forma diferente que en el caso de regresión. Ahora se considera más importante la tabla de análisis de la varianza que los estimadores de los parámetros. En cuanto al resultado obtenido, por muy poco no se consideran significativas a nivel α = 0,05 las diferencias entre los niveles. Respecto a los estimadores, la forma de interpretar la salida es: µ̂ + αˆ0 αˆ1 αˆ2 αˆ3 αˆ4 αˆ5 24,0560 2,0380 1,6515 −1,3985 −2,0920 −1,9540 Es decir, el intercept corresponde a la media de las observaciones para el primer nivel del factor. El resto de las observaciones corresponden a desviaciones respecto a la media para el resto de niveles del factor. 8