En el presente escrito, se presenta la práctica de regresión lineal en R, mediante los datos del censo arbóreo de Santiago de Cali, donde se quiere predecir la altura del árbol, mediante el perímetro basal.

Libreria a utilizar

Por el momento solo utilizaremos la libreria readxl para cargar los datos directamente desde Excel.

library(readxl)
library(corrplot)
## corrplot 0.84 loaded

Cargue de datos

El censo arbóreo tiene 291 mil registros y 97 variables, lo que lo convierte en una base de datos pesada para el procesamiento, por tal motivo realizaremos un nuevo data frame con solo las variables requeridas en el procesamiento.

##Cargar datos
censo <- read_excel("D:/Posgrado/1. Primer semestre/1. Clase tratamiento de datos espaciales/Clase 6/Tarea/Arboles_Cali.xlsx")

Los criterios de reducción de la base de datos, como primer instancia, sera solo seleccionar los samanes (nombre común), y variables espaciales y taxonómicas.

##Samanes en Cali
samanes <- censo[censo$nombre_comun=="Saman, Genizaro",c(2,4,5,8,9,12,13,16,17,18,20,24,25,26,27,31,37)]
dim(samanes)
## [1] 6456   17
str(samanes)
## tibble [6,456 x 17] (S3: tbl_df/tbl/data.frame)
##  $ id               : chr [1:6456] "0101G12263675" "0101G12263681" "0101G12263683" "0101G12263686" ...
##  $ barrio           : chr [1:6456] "Terron Colorado" "Terron Colorado" "Terron Colorado" "Terron Colorado" ...
##  $ comuna           : num [1:6456] 1 1 1 1 1 1 1 1 1 1 ...
##  $ nombre_comun     : chr [1:6456] "Saman, Genizaro" "Saman, Genizaro" "Saman, Genizaro" "Saman, Genizaro" ...
##  $ nombre_cientifico: chr [1:6456] "Albizia saman" "Albizia saman" "Albizia saman" "Albizia saman" ...
##  $ vegetacion       : chr [1:6456] "Arbol" "Arbol" "Arbol" "Arbol" ...
##  $ edad             : chr [1:6456] "Juvenil" "Maduro" "Longevo" "Longevo" ...
##  $ confinamiento    : chr [1:6456] "No" "No" "No" "No" ...
##  $ emplazamiento    : chr [1:6456] "Escenario depor/cult" "Escenario depor/cult" "Escenario depor/cult" "Escenario depor/cult" ...
##  $ pb               : num [1:6456] 0.47 0.62 2.54 6 1.3 0.95 2.13 1.28 0.95 0.63 ...
##  $ DAP              : num [1:6456] 0.06 0.17 0.73 0.38 0.25 0.18 0.6 0.31 0.25 0.17 ...
##  $ altura_fuste     : num [1:6456] 2 2.2 6 2.5 3 3 4.2 6 4 4 ...
##  $ altura_arbol     : num [1:6456] 4 5 12 10 8.5 4.5 8.2 10 7.5 7.5 ...
##  $ diferencia       : num [1:6456] 2 2.8 6 7.5 5.5 1.5 4 4 3.5 3.5 ...
##  $ diametro_copa    : num [1:6456] 4.5 8.5 25 15 11 7.4 7.3 17 11 5.1 ...
##  $ fuste            : chr [1:6456] "Fuste Polifurcado" "Fuste Unico" "Fuste Unico" "Fuste Polifurcado" ...
##  $ vitalidad        : chr [1:6456] "Regular" "Regular" "Regular" "Regular" ...
par(mfrow=c(2,2))

boxplot(samanes$pb)
hist(samanes$pb)

boxplot(samanes$altura_arbol)
hist(samanes$altura_arbol)

Se resalta que existe mas de una variable correlacionada con la altura, sin embargo, utilizaremos solamente el pb para intentar predecir mediante una regresión lineal, la altúra del arbol.

cor_datos<-round(cor(samanes[,c(10,11,12,13,14,15)]), 1)
corrplot(cor_datos, method="number", type="upper")

Se supone, que a medida que un árbol crezca, aumentará la altura pero de igual manera incrementará el grosor y expansión de otros atributos, como su base, fuste (tallo) y raíces. Sin embargo, solo para fines académicos, y la práctica de regresión lineal, asociaremos en un modelo las variables altura del árbol y perímetro de la base. No obstante, las condiciones en las que se encuentre el árbol, puede generar variaciones en sus características, por tal razón se utilizaran solo aquellos árboles en condiciones óptimas y con buena vitalidad, es por esta razón que la base de datos se reduce por estos atributos, de la siguiente manera:

samanes_optimos <- samanes[samanes$confinamiento=="No"&samanes$fuste=="Fuste Unico"&samanes$vitalidad=="Sano",]
dim(samanes_optimos)
## [1] 725  17
plot(samanes_optimos$pb,samanes_optimos$altura_arbol,xlab="Perimetro Basal", ylab="Altura del arbol")

cor(samanes_optimos$pb,samanes_optimos$altura_arbol)
## [1] 0.7637705

Regresión lineal altura del arbol vs perimetro de la base

La regresión lineal, presenta la asociación de dos variables, una independiente y otra dependiente, las cuales son modeladas mediante parámetros calculados mediante Mínimos Cuadrados Ordinarios (MCO). En el caso de este pequeño análisis se parte del supuesto que la altura del árbol dependerá del perímetro que alcance su base, no obstante, y como se verá más adelante, pueden existir mas variables que ayuden a construir un mejor modelo, ademas de problemas con datos atípicos, entre otros fenómenos que son necesarios conciderar antes de construir un modelo.

regresion <- lm(samanes_optimos$altura_arbol~samanes_optimos$pb)
summary(regresion)
## 
## Call:
## lm(formula = samanes_optimos$altura_arbol ~ samanes_optimos$pb)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -9.9031 -1.8080 -0.3906  1.6726 15.2690 
## 
## Coefficients:
##                    Estimate Std. Error t value Pr(>|t|)    
## (Intercept)         4.31742    0.18788   22.98   <2e-16 ***
## samanes_optimos$pb  3.06631    0.09638   31.82   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.782 on 723 degrees of freedom
## Multiple R-squared:  0.5833, Adjusted R-squared:  0.5828 
## F-statistic:  1012 on 1 and 723 DF,  p-value: < 2.2e-16

El modelo de regresión presenta un ajuste bajo de 0.58, por lo que una regresión lineal no se ajuste al modelamiento del fenómeno, o se requiera una transformación. Sin embargo, observando los parámetros, se tanto el beta_0 como el beta_1 son significativos para el modelo.

par(mfrow=c(2,2))
plot(regresion)

Ahora, observando los supuestos, se evidencia el incumplimiento de todos los supuestos, tanto en correlación de sus residuos, problemas de normalidad, en especial de colas pesadas, posiblemente por los valores atípicos como las observaciones 154, 370, 309.

Debido a que la idea solo es aprender los conceptos básicos de una regresión lineal, no se abordará una solución estricta a los supuestos, y se partirán solo de análisis básicos, como la eliminación de datos atípicos y la transformación de la variable dependiente.

samanes_optimos[c(154,370,309),] <- NA
cor(samanes_optimos$pb,samanes_optimos$altura_arbol,use="complete.obs")
## [1] 0.7724348
regresion <- lm((samanes_optimos$altura_arbol)^2~samanes_optimos$pb)
summary(regresion)
## 
## Call:
## lm(formula = (samanes_optimos$altura_arbol)^2 ~ samanes_optimos$pb)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -173.20  -26.68  -13.71   24.76  300.41 
## 
## Coefficients:
##                    Estimate Std. Error t value Pr(>|t|)    
## (Intercept)          14.211      3.745   3.795  0.00016 ***
## samanes_optimos$pb   54.640      1.925  28.384  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 55.45 on 720 degrees of freedom
##   (3 observations deleted due to missingness)
## Multiple R-squared:  0.5281, Adjusted R-squared:  0.5274 
## F-statistic: 805.7 on 1 and 720 DF,  p-value: < 2.2e-16
par(mfrow=c(2,2))
plot(regresion)

No se observa mayor mejoría en los supuestos, a pesar de eliminar las observaciones atípicas 154, 370, 309, y realizar una transformación cuadrática, por lo que es necesario aplciar tecnicas mas profundas o transformaciones robustas como la boxcox, ademas de plantearse la necesidad de adicioanr variables al modelo para mejorar el ajuste.

A pesar de los resutlados, se realiza una predicción para el cumplimiento del objetivo del trabajo, donde se desa conocer que altura podrá alcanzar un arbol si su perímetro basal alcanza los 5.5 metros:

#sqrt(predict(regresion, newdata = list(samanes_optimos$pb=5.5)))