Un ingeniero investiga la posibilidad de generar electricidad mediante un molino de viento. Después de un tiempo ha registrado la corriente eléctrica que sale del molino y la velocidad del viento.
Lectura de datos
datos <- generacionEnergia.data <- read.table('../../data/molino.dat', header=TRUE)
dim(generacionEnergia.data)
## [1] 25 3
head(generacionEnergia.data)
## obs velocidad voltaje
## 1 1 5.0 1.582
## 2 2 6.0 1.822
## 3 3 3.4 1.057
## 4 4 2.7 0.500
## 5 5 10.0 2.236
## 6 6 9.7 2.386
Estadísticos descriptivos de los datos.
summary(generacionEnergia.data, )
## obs velocidad voltaje
## Min. : 1 Min. : 2.450 Min. :0.123
## 1st Qu.: 7 1st Qu.: 3.950 1st Qu.:1.144
## Median :13 Median : 6.000 Median :1.800
## Mean :13 Mean : 6.132 Mean :1.610
## 3rd Qu.:19 3rd Qu.: 8.150 3rd Qu.:2.166
## Max. :25 Max. :10.200 Max. :2.386
Se grafican los datos.
with(datos,plot(velocidad, voltaje,
xlab="velocidad (mph) ", ylab="voltaje (kv)", main="Generación de Energía"))
Pareciera haber una leve curvatura, sin embargo se ajusta un modelo de regresión lineal simple y se despliega las tablas de regresión y de análisis de varianza
mod1 <- generacionEnergia.mod1 <- lm(voltaje ~ velocidad, data=generacionEnergia.data)
summary(generacionEnergia.mod1)
##
## Call:
## lm(formula = voltaje ~ velocidad, data = generacionEnergia.data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.59869 -0.14099 0.06059 0.17262 0.32184
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.13088 0.12599 1.039 0.31
## velocidad 0.24115 0.01905 12.659 7.55e-12
##
## Residual standard error: 0.2361 on 23 degrees of freedom
## Multiple R-squared: 0.8745, Adjusted R-squared: 0.869
## F-statistic: 160.3 on 1 and 23 DF, p-value: 7.546e-12
anova(generacionEnergia.mod1)
## Analysis of Variance Table
##
## Response: voltaje
## Df Sum Sq Mean Sq F value Pr(>F)
## velocidad 1 8.9296 8.9296 160.26 7.546e-12
## Residuals 23 1.2816 0.0557
En lugar de utilzar las gráficas de la regresión que R ofrece, se compilan las funciones yhatres.plot y normres.plot para la graficación de los residuales contra respuesta ajustada y en escala de probilidad normal.
source('../code/0-yhatres.plot.R')
source('../code/0-normres.plot.R')
Gráficas comunes de residuales
opar <- par(no.readonly=TRUE)
par(mfrow=c(1,2), pty="s")
yhatres.plot(mod1)
title("Residuales vs. voltaje ajustado", cex.main=0.9)
normres.plot(mod1)
title("Gráfico de cuantil-cuantil normal", cex.main=0.9)
title("Gráficas de Residuales modelo 1", outer=TRUE, line=-2)
par(opar)
Mediante al análisis gráfico de los residuales se hace evidente el “mal ajuste” del modelo a los datos. Se sugiere la transformación \(X=1/x\) del regresor.
Se ajusta ahora \(y= \beta_0 + \beta_1 X + \epsilon\) y se obtiene
mod2 <- generacionEnergia.mod2 <- lm(voltaje ~ I(1/velocidad), data=generacionEnergia.data)
summary(generacionEnergia.mod2)
##
## Call:
## lm(formula = voltaje ~ I(1/velocidad), data = generacionEnergia.data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.20547 -0.04940 0.01100 0.08352 0.12204
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.9789 0.0449 66.34 <2e-16
## I(1/velocidad) -6.9345 0.2064 -33.59 <2e-16
##
## Residual standard error: 0.09417 on 23 degrees of freedom
## Multiple R-squared: 0.98, Adjusted R-squared: 0.9792
## F-statistic: 1128 on 1 and 23 DF, p-value: < 2.2e-16
anova(generacionEnergia.mod2)
## Analysis of Variance Table
##
## Response: voltaje
## Df Sum Sq Mean Sq F value Pr(>F)
## I(1/velocidad) 1 10.007 10.0072 1128.4 < 2.2e-16
## Residuals 23 0.204 0.0089
Con los correspondientes gráficos de los residuales
opar <- par(no.readonly=TRUE)
par(mfrow=c(1,2), pty="s")
yhatres.plot(mod2)
title("Residuales vs. voltaje ajustado", cex.main=0.9)
normres.plot(mod2)
title("Gráfico de cuantil-cuantil normal", cex.main=0.9)
title("Gráficas de Residuales modelo 2", outer=TRUE, line=-2)
par(opar)
Una manera alternativa de realizar el ajuste anterior sería definir la variable \(X\) en el marco de datos generacionEnergia.data y ajustar directamente con el regresor \(X\).
generacionEnergia.data$X <- 1/generacionEnergia.data$velocidad
head(generacionEnergia.data)
## obs velocidad voltaje X
## 1 1 5.0 1.582 0.2000000
## 2 2 6.0 1.822 0.1666667
## 3 3 3.4 1.057 0.2941176
## 4 4 2.7 0.500 0.3703704
## 5 5 10.0 2.236 0.1000000
## 6 6 9.7 2.386 0.1030928
with(generacionEnergia.data,plot(X,voltaje, xlab="1/velocidad", ylab="voltaje"))
mod3 <- generacionEnergia.mod3 <- lm(voltaje ~ X, data=generacionEnergia.data)
summary(generacionEnergia.mod3)
##
## Call:
## lm(formula = voltaje ~ X, data = generacionEnergia.data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.20547 -0.04940 0.01100 0.08352 0.12204
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.9789 0.0449 66.34 <2e-16
## X -6.9345 0.2064 -33.59 <2e-16
##
## Residual standard error: 0.09417 on 23 degrees of freedom
## Multiple R-squared: 0.98, Adjusted R-squared: 0.9792
## F-statistic: 1128 on 1 and 23 DF, p-value: < 2.2e-16
anova(generacionEnergia.mod3)
## Analysis of Variance Table
##
## Response: voltaje
## Df Sum Sq Mean Sq F value Pr(>F)
## X 1 10.007 10.0072 1128.4 < 2.2e-16
## Residuals 23 0.204 0.0089