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: sal lag trend dis Salinidad en promedio quincenal Salinidad promedio en la quincena anterior Factor 0-6 que indica el periodo Caudal del río 2. Análisis descriptivo En primer lugar vamos a describir los datos. Las principales medidas numéricas son: summary(salinity) sal lag trend dis Min. : 4.300 Min. : 4.300 Min. :0.0 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 :10.554 Mean :10.332 Mean :2.5 Mean :23.73 1
3rd Qu.:13.025 3rd Qu.:13.025 3rd Qu.:4.0 3rd Qu.:24.86 Max. :15.100 Max. :15.000 Max. :5.0 Max. :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: sal lag dis 22 26 30 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 1.0000000 3. 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: sal i = β 0 + β 1 dis i + ɛ 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 5.130 2.39e-05 *** dis -0.5149 0.1858-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 Sum Sq Mean Sq F value Pr(>F) dis 1 55.771 55.771 7.6772 0.01019 * Residuals 26 188.878 7.265 Ejercicios A partir de los resultados anteriores, responde a las preguntas siguientes: 1. Cuál es el valor de la varianza residual s 2 R? 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 Sample Quantiles 4 2 0 2 4 residuos 4 2 0 2 4 2 1 0 1 2 Theoretical Quantiles 6 7 8 9 10 11 12 ajustados Ejercicios 1. Demuestra que la varianza de los residuos viene dada por: Var(e i ) = σ 2 (1 h i ), 4
donde h i = 1/n + (x i x) 2 /S xx. 2. Si se definen los residuos estandarizados como: r i = e i s R 1 hi, i = 1,..., n, entonces las variables r i 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 w i = (x i x) 2 /S xx, 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) El resultado es el siguiente gráfico: 0.0 0.1 0.2 0.3 0.4 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 R 2 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
Salinidad obs.16 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: dis ij = µ + α 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 Sum Sq Mean Sq F value Pr(>F) ftrend 5 77.562 15.512 2.5698 0.05622. Residuals 22 132.801 6.036 --- 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