Con base en los datos de ofertas de vivienda descargadas del portal Fincaraiz realizar los siguientes puntos:
require(ggplot2)
require(ggpubr)
breaks <- pretty(range(datos$Area_contruida),
n = nclass.Sturges(datos$Area_contruida),
min.n = 1)
g1= ggplot(datos,aes(x=Area_contruida))+
geom_histogram(aes(y = ..density..),
color = 1, fill = "#D0D1E6",
breaks = breaks) +
geom_density(color = "#74A9CF",lwd = 0.8)+
theme_classic()
breaks <- pretty(range(datos$precio_millon),
n = nclass.Sturges(datos$precio_millon),
min.n = 1)
g2= ggplot(datos,aes(x=precio_millon))+
geom_histogram(aes(y = ..density..),
color = 1, fill = "#D0D1E6",
breaks = breaks) +
geom_density(color = "#74A9CF",lwd = 0.8)+
theme_classic()
ggarrange(g1,g2,labels = c("Area construida", "Precio en millones"),ncol = 2, nrow = 1)
y <- table1::table1(~precio_millon+Area_contruida, data = datos)
y
| Overall (N=26) |
|
|---|---|
| precio_millon | |
| Mean (SD) | 332 (82.1) |
| Median [Min, Max] | 305 [240, 480] |
| Area_contruida | |
| Mean (SD) | 116 (35.5) |
| Median [Min, Max] | 97.0 [80.0, 195] |
En cuanto al análisis de las variables podemos ver que:
\(*\) El área construida tiene una media de 116 metros cuadrados y una mediana de 97 metros cuadrados, con una desviación estándar de 35.5 metros cuadrados, con esto vemos una distribución asimetrica positiva, donde la media esta concentrada en la parte izquierda y se cuenta con una amplia cola derecha.
\(*\) El precio de las viviendas cuenta con una media de 332 millones de pesos, y una mediana de 305 millones de pesos, con una desviación estándar de 82.1 millones de pesos. Cuando analizamos la distribución vemos un comportamiento bimodal.
library("car")
scatterplot(precio_millon ~ Area_contruida, data = datos, main=c("Correlacion",cor.test(datos$Area_contruida, datos$precio_millon)$estimate))
Con este análisis bivariado, podemos ver una relación fuerte y positiva entre ambas variables. Se tiene un coeficiente de correlación de 0.919, y la dinámica expuesta en la gráfica anterior muestra que a medida que el área construida incrementa, también lo hace el precio en millones de la vivienda. A pesar de tener clara la relación directa y positiva entre ambas variables, es posible ajustar esta relación con diferentes aproximaciones. Inicialmente se considerará una aproximación lineal de ambas variables en su estado natural (sin transformaciones)
library("stargazer")
modelo1=lm(precio_millon~Area_contruida)
stargazer(modelo1, type = 'html')
| Dependent variable: | |
| precio_millon | |
| Area_contruida | 2.124*** |
| (0.186) | |
| Constant | 86.234*** |
| (22.479) | |
| Observations | 26 |
| R2 | 0.845 |
| Adjusted R2 | 0.838 |
| Residual Std. Error | 33.048 (df = 24) |
| F Statistic | 130.455*** (df = 1; 24) |
| Note: | p<0.1; p<0.05; p<0.01 |
La estimación del modelo propuesto \(Precio = \beta_0 + \beta_1 Area Construida\) nos da respuesta a varias cuestiones. Por un lado el intercepto, \(\beta_0\), nos indica el precio base de las viviendas; dada la especificación del modelo planteado este precio es de 86.23 millones de pesos, es decir incluso cuando un inmueble no posee area este seria el valor que se cobraria. Por su lado el coeficiente \(\beta_1\) nos muestra la elasticidad de respuesta del precio de las viviendas al área construida, es decir por incrementos en una unidad den el área de la vivienda, se espera incrementos de 2.124 millones de pesos en el precio del inmueble.
4.Construir un intervalo de confianza (95%) para el coeficiente \(\beta_1\), interpretar y concluir si el coeficiente es igual a cero o no. Compare este resultado con una prueba de hipotesis t.
library(kableExtra)
x=confint(modelo1, level=.95)
x %>%
kbl(booktabs = T,) %>%
kable_classic_2(full_width = F)
| 2.5 % | 97.5 % | |
|---|---|---|
| (Intercept) | 39.839830 | 132.627917 |
| Area_contruida | 1.740169 | 2.507772 |
Cuando construimos un intervalo de confianza del 95 porciento, podemos ver que tanto el intercepto como el \(\beta\) asociado al área de construcción son positivos, esto indica que la relación entre las variables es positiva, ademas el hecho que el intervalo no incluya el cero muestra una significancia estadística; Esta respuesta que es consistente con el resultado de la regresión previamente planteada, bajo la cual ambos coeficientes son estadísticamente significativos al 95%, esto quiere decir que con este nivel de confianza se rechaza la hipótesis nula, bajo la cual los parametros del modelos son es iguales a 0.
G=matrix(c(summary(modelo1)$r.squared,summary(modelo1)$adj.r.squared), ncol=1)
rownames(G)<- c("R Cuadrado","R Cuadrado ajustado")
G %>%
kbl(booktabs = T,) %>%
kable_classic_2(full_width = F)
| R Cuadrado | 0.8446152 |
| R Cuadrado ajustado | 0.8381408 |
El \(R^2\) o \(R^2 ajustado\) muestran la bondad de ajuste del modelo, es decir que tanto las variables explicativas, en este caso el área de construcción como el intercepto son capaces de explicar la variabilidad de la variable dependiente, en este caso el precio en millones de pesos del inmueble. Ambos coeficientes muestran que el grado explicativo del modelo propuesto de alrededor de 84%.
p=predict(modelo1,list(Area_contruida=110),interval = "confidence",level = 0.95)
G=matrix(c(p[1], p[2], p[3]), ncol=3)
colnames(G)<- c("Media","Inferior","Superior")
rownames(G)<- c("Precio estimado en millones")
G %>%
kbl(booktabs = T,) %>%
kable_classic_2(full_width = F)
| Media | Inferior | Superior | |
|---|---|---|---|
| Precio estimado en millones | 319.8706 | 306.3133 | 333.4279 |
Si, sería una muy buena oferta, dado que el precio estimado de una vivienda con un área construida de 110 metros cuadrados es de 319.87 millones de pesos, con un intervalo de 309.31 millones y 333.43 millones. Otras consideraciones que se deberían tener en cuenta, es el estado del inmueble, la disposición del espacio, la ubicación y su índice de criminalidad, dado que como vimos en el punto anterior, el modelo tiene una muy buena bondad de ajuste, pero no es capaz de explicar toda la variabilidad de la variable dependente.
#install.packages("olsrr")
library(olsrr)
library(lmtest)
library(skedastic)
par(mfrow=c(2,2))
plot(modelo1)
X=ols_test_normality(modelo1)
G=matrix(c(matrix(c(round(X$kolmogorv$p.value,3), round(X$shapiro$p.value,3),round(X$anderson$p.value,3),'','' ), ncol=1), matrix(c('','','',round(bptest(modelo1)$p.value,3),round(white_lm(modelo1)$p.value,3)), ncol=1)), ncol=2)
colnames(G)<- c("Normalidad","Homocedasticidad")
rownames(G)<- c("Kolmogorov","Shapiro","Anderson","Breusch-Pagan","White")
G %>%
kbl(booktabs = T,) %>%
kable_classic_2(full_width = F)
| Normalidad | Homocedasticidad | |
|---|---|---|
| Kolmogorov | 0.412 | |
| Shapiro | 0.301 | |
| Anderson | 0.188 | |
| Breusch-Pagan | 0.015 | |
| White | 0.039 |
Existen 4 supuestos principales:
\(*\) Normalidad de los errores
\(*\) Homocedasticidad de los errores
\(*\) Ausencia de autocorrelación de los errores
\(*\) Media cero de los errores.
Inicialmente vamos a analisar la linealidad, para esto revisamos el grafico de Residual vs Fitted, en este vemos que los residuales no tienen comportamiento de nube, sino que parecen tener un comprortamiento hiperbolico o polinomico, mostrando que tal vez la relacion lineal no es la correcta para estas dos variables.
Para poder validad la normalidad de los errores podemos hacer uso de dos herramientas, la primera es realizar graficas qq de normalidad y lo segundo es apoyarnos con test estadísticos, como Shapiro wilk, Kolmogorov-Smirnov y Anderson-Darling. Con todos los test (se tiene un valor p mayor a 0.05, por lo cual no se rechaza la hipótesis nula de normalidad) y los gráficos de normalidad podemos decir que no existe evidencia a favor de la no normalidad de los residuos de la regresión, por lo cual no se estaría violando este supuesto.
Para validad el segundo supuesto, el de homocedasticidad, el cual consiste en que la varianza de los errores sea contante, realizaremos pruebas estadísticas, como Breusch-Pagan, el test de White y las compararemos con el gráfico de Scale-Location. Con los resultados reportados en el gráfico y en los test estadísticos, se puede decir que existe evidencia a favor de heterocedasticidad presente en la regresión, dado que los valores p en las pruebas son menores al valor de significancia típico de 0.05, se rechaza la hipótesis nula de homocedasticidad. En términos gráficos se puede ver que los errores siguen una pendiente y no tienen comportamiento de nube en los gráficos mencionados, y con esto se estaría violando uno de los supuestos necesarios y por lo tanto la estimación por MCO no sería eficiente (aunque los coeficientes siguen siendo insesgado y consistentes), ya que la varianza no es óptima, y en este caso los estadístico t y f no se podría usar tal y como están.
En cuanto a la no autocorrelación de los errores, dado que contamos con unos datos de corte transversal y no serie de tiempo, no debería existir una violación de este supuesto.
Y finalmente la media cero de los errores hace referencia a la especificación correcta del modelo, si por ejemplo estamos ante un caso de variables omitidas es de esperarse que el termino error contenga el comportamiento de esta variable y genere un efecto constante en los residuales. Esto se puede validar con la grafica Residuals vs fitted, y sacando la esperanza matemática de los errores. Con estos resultados podemos ver que aunque la media de los errores no parece ser cero a simple vista, al sacar el valor exacto de esta podemos ver que es 0. Si embargo los residuales presentes en la grafican tienen un comportamiento hiperbólico, que puede dar a entender algún efecto omitido.
Par poder corregir los problemas de heterocedasticidad y linealidad, realizaremos unas transformaciones de los datos, de tal manera que la relación entre las variables (transformadas) puede expresarse de mejor manera bajo una regresión lineal.
t=1/Area_contruida
modelo2=lm(precio_millon~t)
stargazer(modelo1,modelo2, type = 'html')
| Dependent variable: | ||
| precio_millon | ||
| (1) | (2) | |
| Area_contruida | 2.124*** | |
| (0.186) | ||
| t | -32,464.720*** | |
| (1,895.322) | ||
| Constant | 86.234*** | 635.350*** |
| (22.479) | (18.274) | |
| Observations | 26 | 26 |
| R2 | 0.845 | 0.924 |
| Adjusted R2 | 0.838 | 0.921 |
| Residual Std. Error (df = 24) | 33.048 | 23.054 |
| F Statistic (df = 1; 24) | 130.455*** | 293.398*** |
| Note: | p<0.1; p<0.05; p<0.01 | |
Dado que el supuesto que se está violando en el modelo planteado en el punto 3, es el de homocedasticidad, tenemos que indagar en las causas de este, para ver si la solución puede ser una transformación, o si es necesario realizar una estimación con los errores robustos de white, de tal forma que las inferencias estadísticas tengan validez asindotica sobre los valores de los parámetros.
Viendo las gráficas de valides de los supuestos y los test estadísticos, podemos ver que no hay fallas en el supuesto de normalidad, tampoco tenemos presencia de datos atípicos, o cambios estructurales. Podemos entonces están ante la presencia de omisiones de variables en la especificación o errores en la especificación de la forma funcional. Dado que tambien vemos una violacion en el supuesto de linealidad de las variables (grafica Residual vs Fitted), es razonable optimar por la utima opcion, y generar una transformacion de las variables tal que con esto si se pueda expresar una relacion lineal entre ellas.
Para esto usamos diferentes especificaciones y evaluamos el supuesto de homocedasticidad para poder ver si la estimación de MCO es ahora eficiente, las especificacion del modelo a elegir estan en linea con el analisis bivariado que se realizo en el taller, donde se ve que los datos si bien tienen una relacion directa y fuerte, parecen tener un ajuste hiperbolico o polinomico. En este reporte se mostrara aquel con mejor bondad de ajuste
par(mfrow=c(2,2))
plot(modelo2)
X=ols_test_normality(modelo2)
G=matrix(c(matrix(c(round(X$kolmogorv$p.value,3), round(X$shapiro$p.value,3),round(X$anderson$p.value,3),'','' ), ncol=1), matrix(c('','','',round(bptest(modelo2)$p.value,3),round(white_lm(modelo2)$p.value,3)), ncol=1)), ncol=2)
colnames(G)<- c("Normalidad","Homocedasticidad")
rownames(G)<- c("Kolmogorov","Shapiro","Anderson","Breusch-Pagan","White")
G %>%
kbl(booktabs = T,) %>%
kable_classic_2(full_width = F)
| Normalidad | Homocedasticidad | |
|---|---|---|
| Kolmogorov | 0.722 | |
| Shapiro | 0.587 | |
| Anderson | 0.59 | |
| Breusch-Pagan | 0.103 | |
| White | 0.248 |
Este segundo modelo, hace referencia a un ajuste hiperbolico, con este se ve una bondad de ajuste superior que en las otras especificaciones, y adicionalmente podemos ver tanto grafica como en los test estadísticos que se están cumpliendo los supuestos de las regresiones lineales, generando que los estimadores sean consistentes, insesgados y eficientes. A diferencia del modelo1 (planteado en el punto 3) se puede ver que ahora la grafica de Residual vs Fitted tiene comportamiento de nube, al igual que Sacle-Location, mostrando que los dos supuestos que se estaban violando, se han arreglado con la transformacion necesaria.