La regresión lineal es una técnica de modelado estadístico que se emplea para describir una variable de respuesta continua como una función de una o varias variables predictoras. Puede ayudar a comprender y predecir el comportamiento de sistemas complejos o a analizar datos experimentales, financieros y biológicos.
Fuente: https://la.mathworks.com/discovery/linear-regression.html
#grasas <- read.table('http://verso.mat.uam.es/~joser.berrendero/datos/EdadPesoGrasas.txt', header = TRUE)
#names(grasas)
library("readr")
## Warning: package 'readr' was built under R version 3.6.3
Prodmiel2018muni <- read_csv("Prodmiel2018muni.csv")
##
## -- Column specification --------------------------------------------------------
## cols(
## Nomestado = col_character(),
## Nommunicipio = col_character(),
## Volumen = col_double(),
## Valor = col_double()
## )
Prodmiel2018muni <- Prodmiel2018muni[,3:4]
#View(Prodmiel2018muni)
#names(Prodmiel2018muni)
#typeof(Prodmiel2018muni)
#pairs(grasas)
pairs(Prodmiel2018muni)
Aqui podemos observar que hay una estrecha relación entre el volumen y el valor de la miel en los diferentes estados y municipios de México, se ve claramente que van en una diagonal en aumento lo que nos deja en claro algo obvio: cuando uno aumenta tambien el otro, esto lo podemos comprobar con lo siguiente.
En estadística, el coeficiente de correlación de Pearson es una medida de dependencia lineal entre dos variables aleatorias cuantitativas. A diferencia de la covarianza, la correlación de Pearson es independiente de la escala de medida de las variables. De manera menos formal, podemos definir el coeficiente de correlación de Pearson como un índice que puede utilizarse para medir el grado de relación de dos variables siempre y cuando ambas sean cuantitativas y continuas.
#cor(grasas)
cor(Prodmiel2018muni)
## Volumen Valor
## Volumen 1.0000000 0.9920269
## Valor 0.9920269 1.0000000
Se puede observar que tienen una corrrelación de caso el 100% con un 99% de correlación.
El comando básico es lm (linear models). El primer argumento de este comando es una fórmula y ~ x en la que se especifica cuál es la variable respuesta o dependiente (y ) y cuál es la variable regresora o independiente (x). El segundo argumento, llamado data especifica cuál es el fichero en el que se encuentran las variables. El resultado lo guardamos en un objeto llamado regresion. Este objeto es una lista que contiene toda la información relevante sobre el análisis. Mediante el comando summary obtenemos un resumen de los principales resultados:
#regresion <- lm(grasas ~ edad, data = grasas )
#summary(regresion)
regresionMiel <- lm(Valor ~ Volumen, data = Prodmiel2018muni)
summary(regresionMiel)
##
## Call:
## lm(formula = Valor ~ Volumen, data = Prodmiel2018muni)
##
## Residuals:
## Min 1Q Median 3Q Max
## -6163.6 -168.9 -121.8 20.0 7667.8
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 186.117 15.677 11.87 <2e-16 ***
## Volumen 38.384 0.124 309.60 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 582.9 on 1547 degrees of freedom
## Multiple R-squared: 0.9841, Adjusted R-squared: 0.9841
## F-statistic: 9.585e+04 on 1 and 1547 DF, p-value: < 2.2e-16
Los parámetros de la ecuación de la recta de mínimos cuadrados que relaciona la cantidad de volumen en función del valor que vienen dados por la columna ´Estimate´ de la tabla ´Coefficients´ de la salida anterior. Por lo tanto, en este ejemplo la ecuación de la recta de mínimos cuadrados es:
\[ y = 186.117 + 38.384 x \]
Para tomar el primer valor tomamos el ´Intercept´ y X lo tomamos de la columna ´Estimate´ en la fila de la variable en este caso Volumen
#plot(grasas$edad, grasas$grasas, xlab="Edad", ylab = "Grasas")
#abline(regresion)
plot(Prodmiel2018muni$Volumen, Prodmiel2018muni$Valor, xlab="Volumen", ylab = "Valor")
abline(regresionMiel)
El coeficiente de determinación (es decir, el coeficiente de correlación al cuadrado) mide la bondad del ajuste de la recta a los datos. A partir de la salida anterior, vemos que su valor en este caso es Multiple R-squared: 0.9841.
#nuevas.edades <- data.frame(edad = seq(30, 50))
#predict(regresion, nuevas.edades)
nuevos.volumenes <- data.frame(Volumen = seq(100, 500))
predict(regresionMiel, nuevos.volumenes)
## 1 2 3 4 5 6 7 8
## 4024.491 4062.875 4101.258 4139.642 4178.026 4216.410 4254.793 4293.177
## 9 10 11 12 13 14 15 16
## 4331.561 4369.945 4408.328 4446.712 4485.096 4523.480 4561.863 4600.247
## 17 18 19 20 21 22 23 24
## 4638.631 4677.014 4715.398 4753.782 4792.166 4830.549 4868.933 4907.317
## 25 26 27 28 29 30 31 32
## 4945.701 4984.084 5022.468 5060.852 5099.236 5137.619 5176.003 5214.387
## 33 34 35 36 37 38 39 40
## 5252.771 5291.154 5329.538 5367.922 5406.306 5444.689 5483.073 5521.457
## 41 42 43 44 45 46 47 48
## 5559.841 5598.224 5636.608 5674.992 5713.376 5751.759 5790.143 5828.527
## 49 50 51 52 53 54 55 56
## 5866.911 5905.294 5943.678 5982.062 6020.445 6058.829 6097.213 6135.597
## 57 58 59 60 61 62 63 64
## 6173.980 6212.364 6250.748 6289.132 6327.515 6365.899 6404.283 6442.667
## 65 66 67 68 69 70 71 72
## 6481.050 6519.434 6557.818 6596.202 6634.585 6672.969 6711.353 6749.737
## 73 74 75 76 77 78 79 80
## 6788.120 6826.504 6864.888 6903.272 6941.655 6980.039 7018.423 7056.807
## 81 82 83 84 85 86 87 88
## 7095.190 7133.574 7171.958 7210.341 7248.725 7287.109 7325.493 7363.876
## 89 90 91 92 93 94 95 96
## 7402.260 7440.644 7479.028 7517.411 7555.795 7594.179 7632.563 7670.946
## 97 98 99 100 101 102 103 104
## 7709.330 7747.714 7786.098 7824.481 7862.865 7901.249 7939.633 7978.016
## 105 106 107 108 109 110 111 112
## 8016.400 8054.784 8093.168 8131.551 8169.935 8208.319 8246.703 8285.086
## 113 114 115 116 117 118 119 120
## 8323.470 8361.854 8400.238 8438.621 8477.005 8515.389 8553.772 8592.156
## 121 122 123 124 125 126 127 128
## 8630.540 8668.924 8707.307 8745.691 8784.075 8822.459 8860.842 8899.226
## 129 130 131 132 133 134 135 136
## 8937.610 8975.994 9014.377 9052.761 9091.145 9129.529 9167.912 9206.296
## 137 138 139 140 141 142 143 144
## 9244.680 9283.064 9321.447 9359.831 9398.215 9436.599 9474.982 9513.366
## 145 146 147 148 149 150 151 152
## 9551.750 9590.134 9628.517 9666.901 9705.285 9743.668 9782.052 9820.436
## 153 154 155 156 157 158 159 160
## 9858.820 9897.203 9935.587 9973.971 10012.355 10050.738 10089.122 10127.506
## 161 162 163 164 165 166 167 168
## 10165.890 10204.273 10242.657 10281.041 10319.425 10357.808 10396.192 10434.576
## 169 170 171 172 173 174 175 176
## 10472.960 10511.343 10549.727 10588.111 10626.495 10664.878 10703.262 10741.646
## 177 178 179 180 181 182 183 184
## 10780.030 10818.413 10856.797 10895.181 10933.565 10971.948 11010.332 11048.716
## 185 186 187 188 189 190 191 192
## 11087.099 11125.483 11163.867 11202.251 11240.634 11279.018 11317.402 11355.786
## 193 194 195 196 197 198 199 200
## 11394.169 11432.553 11470.937 11509.321 11547.704 11586.088 11624.472 11662.856
## 201 202 203 204 205 206 207 208
## 11701.239 11739.623 11778.007 11816.391 11854.774 11893.158 11931.542 11969.926
## 209 210 211 212 213 214 215 216
## 12008.309 12046.693 12085.077 12123.461 12161.844 12200.228 12238.612 12276.996
## 217 218 219 220 221 222 223 224
## 12315.379 12353.763 12392.147 12430.530 12468.914 12507.298 12545.682 12584.065
## 225 226 227 228 229 230 231 232
## 12622.449 12660.833 12699.217 12737.600 12775.984 12814.368 12852.752 12891.135
## 233 234 235 236 237 238 239 240
## 12929.519 12967.903 13006.287 13044.670 13083.054 13121.438 13159.822 13198.205
## 241 242 243 244 245 246 247 248
## 13236.589 13274.973 13313.357 13351.740 13390.124 13428.508 13466.892 13505.275
## 249 250 251 252 253 254 255 256
## 13543.659 13582.043 13620.426 13658.810 13697.194 13735.578 13773.961 13812.345
## 257 258 259 260 261 262 263 264
## 13850.729 13889.113 13927.496 13965.880 14004.264 14042.648 14081.031 14119.415
## 265 266 267 268 269 270 271 272
## 14157.799 14196.183 14234.566 14272.950 14311.334 14349.718 14388.101 14426.485
## 273 274 275 276 277 278 279 280
## 14464.869 14503.253 14541.636 14580.020 14618.404 14656.788 14695.171 14733.555
## 281 282 283 284 285 286 287 288
## 14771.939 14810.323 14848.706 14887.090 14925.474 14963.857 15002.241 15040.625
## 289 290 291 292 293 294 295 296
## 15079.009 15117.392 15155.776 15194.160 15232.544 15270.927 15309.311 15347.695
## 297 298 299 300 301 302 303 304
## 15386.079 15424.462 15462.846 15501.230 15539.614 15577.997 15616.381 15654.765
## 305 306 307 308 309 310 311 312
## 15693.149 15731.532 15769.916 15808.300 15846.684 15885.067 15923.451 15961.835
## 313 314 315 316 317 318 319 320
## 16000.219 16038.602 16076.986 16115.370 16153.753 16192.137 16230.521 16268.905
## 321 322 323 324 325 326 327 328
## 16307.288 16345.672 16384.056 16422.440 16460.823 16499.207 16537.591 16575.975
## 329 330 331 332 333 334 335 336
## 16614.358 16652.742 16691.126 16729.510 16767.893 16806.277 16844.661 16883.045
## 337 338 339 340 341 342 343 344
## 16921.428 16959.812 16998.196 17036.580 17074.963 17113.347 17151.731 17190.115
## 345 346 347 348 349 350 351 352
## 17228.498 17266.882 17305.266 17343.650 17382.033 17420.417 17458.801 17497.184
## 353 354 355 356 357 358 359 360
## 17535.568 17573.952 17612.336 17650.719 17689.103 17727.487 17765.871 17804.254
## 361 362 363 364 365 366 367 368
## 17842.638 17881.022 17919.406 17957.789 17996.173 18034.557 18072.941 18111.324
## 369 370 371 372 373 374 375 376
## 18149.708 18188.092 18226.476 18264.859 18303.243 18341.627 18380.011 18418.394
## 377 378 379 380 381 382 383 384
## 18456.778 18495.162 18533.546 18571.929 18610.313 18648.697 18687.081 18725.464
## 385 386 387 388 389 390 391 392
## 18763.848 18802.232 18840.615 18878.999 18917.383 18955.767 18994.150 19032.534
## 393 394 395 396 397 398 399 400
## 19070.918 19109.302 19147.685 19186.069 19224.453 19262.837 19301.220 19339.604
## 401
## 19377.988
Los datos vienen de esta ecuacion:
\[ y_i = \beta_0 + \beta_1 x_i + \epsilon_i, \ \ \ \ i=1,\ldots,n, \] donde los errores aleatorios ϵi son independientes con distribución normal de media 0 y varianza σ2
#confint(regresion)
confint(regresionMiel)
## 2.5 % 97.5 %
## (Intercept) 155.36564 216.86758
## Volumen 38.14056 38.62692
#confint(regresion, level=0.90)
confint(regresionMiel, level=0.90)
## 5 % 95 %
## (Intercept) 160.3143 211.91889
## Volumen 38.1797 38.58779
Bajo este modelo
Los errores típicos de los estimadores de los parámetros β0 y β1 se encuentran en la columna Std Error de la salida anterior. En el ejemplo, sus valores son 15.677 y 0.124 respectivamente.
La columna t value contiene el estadístico t, es decir, cociente entre cada estimador y su error típico. Estos cocientes son la base para llevar a cabo los contrastes H0:β0=0 y H0:β1=0
. Los correspondientes p-valores aparecen en la columna Pr(>|t|). En este caso son muy pequeños por lo que se rechazan ambas hipótesis para los niveles de significación habituales.
El estimador de la desviación típica de los errores σ aparece como Residual standard error y su valor en el ejemplo es 582.9
Los intervalos de confianza para los parámetros se obtienen con el comando confint. El parámetro level permite elegir el nivel de confianza (por defecto es 0.95):
Los intervalos de confianza para la respuesta media y los intervalos de predicción para la respuesta se pueden obtener usando el comando predict. Por ejemplo, el siguiente código calcula y representa los dos tipos de intervalos para el rango de volumen que van de 0 a 2000 años (los de predicción en rojo):
nuevos.volumenes <- data.frame(Volumen = seq(0, 2000))
# Grafico de dispersion y recta
plot(Prodmiel2018muni$Volumen, Prodmiel2018muni$Valor, xlab="Volumen", ylab = "Valor")
abline(regresionMiel)
# Intervalos de confianza de la respuesta media
# ic es una matriz con tres columnas: prediccion, las otras 2 son los extremos del intervalo
ic <- predict(regresionMiel, nuevos.volumenes, interval = "confidence")
lines(nuevos.volumenes$Volumen, ic[, 2], lty = 2) #lwr
lines(nuevos.volumenes$Volumen, ic[, 3], lty = 3) #upr
# Intervalos de prediccion
ic <- predict(regresionMiel, nuevos.volumenes, interval = "prediction")
lines(nuevos.volumenes$Volumen, ic[, 2], lty = 2, col="red") #lwr
lines(nuevos.volumenes$Volumen, ic[, 3], lty = 3, col="red") #upr
#anova(regresion)
anova(regresionMiel)
## Analysis of Variance Table
##
## Response: Valor
## Df Sum Sq Mean Sq F value Pr(>F)
## Volumen 1 3.2566e+10 3.2566e+10 95855 < 2.2e-16 ***
## Residuals 1547 5.2558e+08 3.3974e+05
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
residuos <- rstandard(regresionMiel) #y
valores.ajustados <- fitted(regresionMiel) #x
plot(valores.ajustados, residuos)
qqnorm(residuos)
qqline(residuos)