Práctica 3: Regresión simple con R

Anuncio
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
Descargar