#Solución base de datos BOSQUE (pag 187 en papel y 201 del pdf del libro) #Todo modelo de Regresión Lineal Múltiple tiene una variable respuesta (y) y #dos o más de dos variables explicativas (x1, x2, x3, …). La formulación en #este caso del modelo sería: y β0 β1x1 β2 x2 ... βp1xp1 ε #Las hipótesis del modelo son (sobre los errores): normalidad, incorrelación, #homocedasticidad (varianza cte) y media cero. #Estudiemos el caso de BOSQUE: #Los pasos fundamentales son los mismos que con el modelo de RLS: 1. 2. 3. 4. Análisis preliminar (Gráfico-numérico) Ajuste del modelo Bondad del ajuste Diagnóstico del modelo #Empezamos: #Leemos los datos DBH <- c(10.2,13.72,15.43,14.37,15,15.02,15.12,15.24,15.24,15.28, 13.78,15.67,15.67,15.98,16.5,16.87,17.26,17.28,17.87,19.13) D16 <-c(9.3,12.1,13.3,13.4,14.2,12.8,14,13.5,14,13.8,13.6,14, 13.7,13.9,14.9,14.9,14.3,14.3,16.9,17.3) HT <-c(89,90.07,95.08,98.03,99,91.05,105.6,100.8,94,93.09,89, 102,99,89.02,95.09,95.02,91.02,98.06,96.01,101) VOL <-c(25.93,45.87,56.2,58.6,63.36,46.35,68.99,62.91,58.13, 59.79,56.2,66.16,62.18,57.01,65.62,65.03,66.74,73.38,82.87,95.71) #Creamos una base de datos con las cuatro variables: bosque<-data.frame(VOL=VOL,DBH=DBH,D16=D16,HT=HT) #Análisis preliminar #Gráfico #Al haber definido la base de datos, podemos hacer un plot “de golpe” de todas #las variables plot(bosque) #En la primera fila de gráficos, vemos cómo se observan relaciones lineales #entre VOL y el resto de variables explicativas (DBH, D16, HT). Las relaciones #son crecientes en todos los casos y más fuertes para el caso de los diámetros #(DBH y D16). #Numérico #Correlaciones simples: cor(bosque) # VOL DBH D16 HT #VOL 1.0000000 0.9078088 0.9530963 0.6010862 #Confirman lo visto en los gráficos anteriores #Correlaciones parciales #Para calcular las correlaciones parciales necesitamos descargar el paquete de #R llamado Rcmdr. Para ello debes ir al menú Paquetes Instalar paquete(s). Se #abrirá entonces una ventana. En ella busca y selecciona “Spain (Madrid)” #OK. Luego se abrirá una nueva ventana. En ella aparecen, por orden #alfabético, todos los paquetes que existen actualmente. Busca el que se llama #“Rcmdr” (encontrarás otros paquetes que comenzarán de la misma forma, #pero SÓLO nos interesa el que se llama exactamente Rcmdr). Lo seleccionas #y pinchas sobre OK. Tardará unos segundos en instalarse todo. Después #escribes en R: library(Rcmdr) #Al darle al Intro se abrirá una nueva VENTANA. Debes cerrarla y seguir #trabajando en R como habitualmente hacemos. Así que sigue escribiendo lo #siguiente: partial.cor(bosque) # VOL DBH D16 HT #VOL 0.0000000 0.3683119 0.7627127 0.7285511 #Detectamos entonces que la variable más importante a la hora de explicar #VOL es D16, seguida de HT. DBH no es tan importante como parecía #inicialmente al ver las correlaciones simples. La variable explicativa menos #importante es DBH. #Ajuste del modelo fit=lm(VOL~DBH+D16+HT) sfit=summary(fit) sfit #Call: #lm(formula = VOL ~ DBH + D16 + HT) #Residuals: # Min 1Q Median 3Q Max #-5.2548 -1.6765 -0.1277 1.5232 4.9990 #Coefficients: # Estimate Std. Error t value Pr(>|t|) #(Intercept) -108.5758 14.1422 -7.677 9.42e-07 *** #DBH 1.6258 1.0259 1.585 0.132611 #D16 5.6714 1.2023 4.717 0.000232 *** #HT 0.6938 0.1631 4.254 0.000606 *** #--#Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 #Residual standard error: 3.095 on 16 degrees of freedom #Multiple R-squared: 0.9591, Adjusted R-squared: 0.9514 #F-statistic: 124.9 on 3 and 16 DF, p-value: 2.587e-11 #El modelo teórico a estimar era: #VOL=b0 + b1*DBH + b2*D16 + b3*HT #El modelo ajustado (estimado) es: #VOL= -108.5758 + 1.6258*DBH + 5.6714*D16 + 0.6938*HT #¿Qué significa que beta 1 = 1.6258? Significa que ceteris paribus (es decir, si #dejamos fijas las otras variables X) y aumentamos en una unidad DBH, VOL #aumenta en 1.6258 unidades. #Calculemos IC al 95% para los coeficientes del modelo: confint(fit) # 2.5 % 97.5 % #(Intercept) -138.5559230 -78.595770 #DBH -0.5491507 3.800682 #D16 3.1227268 8.220064 #HT 0.3480719 1.039469 #Por ejemplo: IC95% β2 3.12,8.22 . #Estudiemos si cada coeficiente puede o no ser cero (contrates de hipótesis) #Por ejemplo: # H0 : β1 0 H1 : β1 0 #p-valor= 0.132611 (tomado del summary de fit) > 0.05 No se rechaza H0. #En consecuencia, es posible que el coeficiente beta 1 sea cero. Lo que #significaría que el modelo nos está indicando que esa variable X (DBH) no es #lo suficientemente útil, en el sentido de que la información contenida en esa #variable para explicar VOL es posible que, en gran medida, se solape con la #información que en este sentido contienen D16 y HT. #Si hacemos el mismo contrate para beta2 y beta3 (para beta 0 no es #importante hacerlo): concluimos en ambos casos que rechazamos que los #coeficientes sean cero. En consecuencia, D16 y HT son variables importantes #a la hora de explicar VOL. Este tipo de análisis está muy relacionado con las #correlaciones parciales calculadas anteriormente. #Bondad del ajuste #Miramos los tres criterios: #Error estándar residual (estimación de sigma), de la tabla de summary: #Residual standard error: 3.095 #¿Es grande o pequeña? Calculamos el coeficiente de variación: cv=100*(3.095/mean(VOL)) cv #Sale 5% el error estándar residual es pequeño estamos ante un buen #modelo según este criterio #Segundo criterio: Tabla de ANOVA. Con la tabla de ANOVA contestamos al #contraste: # H0 : β1 β2 β3 0 H1 : Lo contrario #p-value: 2.587e-11 (tomado del summary de fit) < 0.05 Rechazo H0 El #modelo es bueno según este criterio #Tercer criterio: coeficiente de determinación #Multiple R-squared: 0.9591 #Es decir nuestro modelo de regresión consigue explicar casi el 96% de la #variabilidad total de los datos. Es un muy buen modelo. #No obstante, cuando estimamos un modelo con varias variables explicativas #(X), solemos mirar también el coeficiente R cuadrado ajustado, que también lo #da el summary de fit: # Adjusted R-squared: 0.9514 #Dado que da un valor del 95%, que es parecido al 96% de antes, #interpretaremos finalmente como valor adecuado el R cuadrado original (sin #ajustar). Si encontrásemos grandes diferencias entre el ajustado y el no #ajustado, entonces interpretaríamos el valor del R cuadrado ajustado como el #adecuado para nuestro modelo. #Diagnóstico del modelo: par(mfrow=c(2,2)) plot(fit) #Normalidad #Según el gráfico qqplot, fallaría la normalidad. Veamos el histograma de los #residuos: # Los residuos e(i) se obtienen con: e<-residuals(fit) # Los residuos estandarizados (el otro tipo de residuos) se obtienen con: d<-e/sfit$sigma # el histograma de los residuos, superponiendo una densidad normal: hist(d,probability=T,xlab="Residuos estandarizados",main="",xlim=c(-3,3)) d.seq<-seq(-3,3,length=50) lines(d.seq,dnorm(d.seq,mean(d),sd(d))) #Falla la normalidad, claramente la cola de la derecha es demasiado pesada. #Hagamos un contraste de hipótesis para salir definitivamente de dudas: # H0 : e N H1 : Lo contrario #Contraste de Shapiro-Wilks shapiro.test(e) # Shapiro-Wilk normality test #data: e #W = 0.9679, p-value = 0.7103 #p-valor=0.7103 > 0.05 No se puede rechazar la hipótesis de normalidad (a #pesar de que los gráficos podían indicarnos lo contrario). Los problemas #observados gráficamente no eran tan relevantes como nos parecía en #principio. #Homocedasticidad (hipótesis de varianza constante) #El gráfico de residuos vs valores predichos de VOL deja algunas dudas sobre #el cumplimiento de la hipótesis. Salgamos de dudas con un contraste de #hipótesis: # H0 : Homocedasticidad H1 : Heterocedasticidad # El test de Breusch-Pagan se obtiene con library(lmtest) bptest(fit) # studentized Breusch-Pagan test #data: fit #BP = 3.5341, df = 3, p-value = 0.3164 #p-valor=0.3164 > 0.05 No se puede rechazar la hipótesis de varianza #constante. #Incorrelación #el gráfico de residuos versus el anterior sería: n<-length(d) plot(d[1:(n-1)],d[2:n],xlab="Residuo i",ylab="Residuo i-1") # y capturamos con una curva suavizada la tendencia: lines(lowess(d[1:(n-1)],d[2:n]),col="red") #Gráficamente no se ve ninguna tendencia clara creciente o decreciente. Por lo #que la hipótesis parecería que se cumple. Salgamos de dudas con un #contraste: # H0 : ρ 0 H1 : ρ 0 # El test de Durbin-Watson: library(lmtest) dwtest(fit,alternative="two.sided") # Durbin-Watson test #data: fit #DW = 1.4267, p-value = 0.1148 #alternative hypothesis: true autocorrelation is not 0 #p-valor=0.1148 > 0.05 No puede rechazar la hipótesis de incorrelación. #Finalmente, hipótesis de media cero: Siempre se verifica por cómo ajustamos #el modelo (EMV). #En definitiva, estamos ante un buen modelo donde parece que se cumplen #todas las hipótesis. Procedimientos secuenciales de selección de variables ¿Podemos simplificar el modelo original reduciendo el número de variables explicativas? Utilizaremos el criterio AIC (valores pequeños son preferidos a valores grandes) step(fit) Start: AIC=48.73 VOL ~ DBH + D16 + HT Df Sum of Sq <none> AIC 153.30 48.733 - DBH 1 - HT RSS 24.06 177.36 49.649 1 173.42 326.72 61.867 - D16 1 213.21 366.51 64.166 Call: lm(formula = VOL ~ DBH + D16 + HT) Coefficients: (Intercept) -108.5758 DBH 1.6258 D16 HT 5.6714 0.6938 #No eliminaríamos ninguna variable X. A pesar de que parecía que sobraba DBH. Estimación de la respuesta media y predicción para una nueva observación # Queremos estimar el volumen esperado de madera cuando en las # variables explicativas tenemos los siguientes valores dbh.0=15.5315 d16.0=13.91 ht.0= 95.547 # La estimación de la respuesta media viene dada por fit.d16.0<-predict(fit,data.frame(DBH=dbh.0,D16=d16.0,HT=ht.0),interval="confidence") fit.d16.0 fit lwr upr 61.8515 60.38422 63.31878 La estimación puntual del volumen de madera promedio para un grupo de árboles con esas medidas (en DBH, D16 y HT) sería 61.8515. Y el intervalo de confianza al 95% estaría entre 60.38422 y 63.31878. Calculemos ahora la predicción del volumen de madera para un árbol que tenga las siguientes medidas: dbh.0=20 d16.0=15 ht.0= 105 fit.d16.0<-predict(fit,data.frame(DBH=dbh.0,D16=d16.0,HT=ht.0),interval="prediction") fit.d16.0 fit lwr upr 81.85626 71.43233 92.2802 La estimación puntual del volumen de madera para un árbol con esas medidas (en DBH, D16 y HT) sería 81.85626. Y el intervalo de confianza al 95% estaría entre 71.43233 y 92.2802. Transformación de la variable respuesta (método de Box-Cox) (si fuese necesario) library(MASS) bc<-boxcox(fit,plotit=F) lambda<-bc$x[which.max(bc$y)] lambda #=0.6 #Transformamos VOL en z library(labstatR) # librería que calcula la media geométrica (cargala desde el menú Paquetes #Instalar paquetes # la variable transformada por Box-Cox es: z<-(VOL^lambda-1)/(lambda*mean.g(VOL)^(lambda-1)) z