REGRESIÓN LINEAL SIMPLE EN RSTUDIO

El caso práctico de un ejercicio

Dedicado para mi novia Itzel que me ha llegado a motivar demasiado dentro de la carrera de economía

Introducción

El objetivo del aprendizaje de este documento de regresión lineal simple es:

  • Conocer el cómo construir un modelo de regresión lineal simple que ayude a describir cómo influye una variable. independiente (X) con otra variable que será dependiente (Y),

  • Obtener las estimaciones puntuales de los parámetros descriptivos de dichas variables.

  • Obtener algunas descripciones estadísticas básicas dentro del modelo de regresión lineal.

  • Saber estimar el valor promedio de la variable dependiente (Y) para un valor de la variable independiente (X).

  • Conocer el comportamiento de las variables a través de los errores o residuos.

Ejercicio

Los datos de la producción de trigo en toneladas (X) y el precio del kilo de harina en pesetas (Y) en la década de los 80 en España fueron los siguientes:

Producción de Trigo Precio del kilo de harina en pesetas
30 25
28 30
32 27
25 40
25 42
25 40
22 50
24 45
35 30
40 25

Dispersión gráfica

Para esto, haremos una estimación a través de mínimos cuadrados ordinarios crearemos el modelo de regresión lineal. Primero crearemos los comandos que nos sevirán para tener la variable independiente y la variable dependiente:

Trigo_x = c(30, 28, 32, 25, 25, 25, 22, 24, 35, 40)
Precio_y = c(25, 30, 27, 40, 42, 40, 50, 45, 30, 25)

Crearemos ahora la dispersión de los datos que se tienen entre las variables:

plot(Trigo_x, Precio_y, main = "Dispersión: Precio vs Trigo", panel.first = grid(col = "Grey50"), pch = 20, xlab = "Trigo", ylab = "Precio")

Modelo de regresión

Notamos que existe una dispersión negativa entre la variable dependiente y la variable independiente. Ahora empezaremos a calcular el modelo de regresión lineal a través de mínimos cuadrados ordinarios.

Regresión = lm(Precio_y ~ Trigo_x)
summary(Regresión)
## 
## Call:
## lm(formula = Precio_y ~ Trigo_x)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -8.5049 -2.9164  0.7268  3.3457  5.6657 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  74.1151     8.7358   8.484 2.85e-05 ***
## Trigo_x      -1.3537     0.3002  -4.509  0.00198 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 5.098 on 8 degrees of freedom
## Multiple R-squared:  0.7176, Adjusted R-squared:  0.6824 
## F-statistic: 20.33 on 1 and 8 DF,  p-value: 0.001978

Notamos entonces que la ecuación de regresión quedaría como: \(Y = b_0 + b_1(X_1) + e_i\) En este caso el modelo de regresión lineal es igual a la siguiente ecuación: \(Precio = 74.1151 - 1.3537X_1 + e_i\)

Interpretación

Al aumentar una unidad la producción de trigo (X), disminuirá en 1.3537 el precio del kilo de harina (Y).

Análisis

Dentro de lo que podemos hacer de análisis es:

  • El intercepto, \(b_0\), es significativo, ya que el valor estadístico t de student es de 8.484, y en términos absolutos es mayor a 2; y para validar su nivel de significancia a través de la p de Pearson, vemos que es menor al valor crítico de 0.05. Lo cual el intercepto es estadísticamente significativo.

  • La pendiente, \(b_1\), es significativo, ya que el valor estadístico t de student es de -4.509, y en términos absolutos es mayor a 2; y para validar su nivel de significacia a través de la p de Pearson, vemos que es menor al valor crítico de 0.05. Lo cual la pendiente de la variable independiente es estadísticamente significativo.

  • Observamos también que tenemos un nivel de un \(R^{2}\) de 0.7176, por lo que podemos decir que el 71.76% es explicado por laa variable independiente, el resto es explicado por otras variables externas.

  • También, tenemos nuestro estadístico F de Fisher es de 20.33 a un grado de libertad, incluso su valor p de Pearson es menor que 0.05, por lo que podemos aceptar que en conjunto, nuestro modelo es estadisticamente significativo.

Ahora pasaremos a nuestro modelo de predicción de la variable dependiente.

Estimación

Lo que haremos ahora será Estimar el valor de la variable dependiente (Y)

Predicción = predict(Regresión)
Predicción
##        1        2        3        4        5        6        7        8 
## 33.50485 36.21221 30.79750 40.27323 40.27323 40.27323 44.33426 41.62691 
##        9       10 
## 26.73648 19.96810

Ahora, podemos crear un conjunto de nuestras variables: Dependiente y Estimada

Conjunto = data.frame(Precio_y, Predicción)
Conjunto

Estimaremos los errores \(Errores = Y_{Observada} - Y_{Estimada}\)

Errores = Precio_y - Predicción
plot(Errores, main = "Errores del modelo de Regresión Lineal simple", panel.first = grid(col = "Grey50"), col = "Blue", ylab = "Errores", xlab = "Valor Estimado", pch = 20)

A través de los Errores que da la misma regresión lineal los podemos obtener a través del siguiente comando:

Residuos = residuals(Regresión)
plot(Residuos, main = "Errores del modelo de Regresión Lineal Simple", panel.first = grid(co = "Grey60"), col = "Red", ylab = "Residuos", xlab = "Valor Estimado", pch = 20)

Vemos que en ninguno de los dos casos existe una media (dentro de los errores o residuos) de la varianza y la media \((\sigma^{2}, X_{Media})\). Por lo que presentaremos ahora el análisis de autocorrelación _Durbin - Watson.

Análisis de Autocorrelación (Durbin - Watson)

El análisis de Durbin - Watson de autocorrelación ayuda a estimar que el modelo de regresión lineal no se encuentre con: autocorrelación positiva o autocorrelación negativa.

Los parámetros de la autocorrelación ayudan a saber si el modelo se encuentra subestimado o sobreestimado a través del cálculo y comportamiento de los errores. Debemos de tener un valor dentro de los parámetros de 1.75 a 2.25 para saber que no existe una autocorrelación dentro del modelo de regresión.

  • Si el valor es menor que 1.75, existe evidencia de autocorrelación positiva, en otras palabras, el modelo se encuentra sobreestimado. Por lo que para corregirlo se debe de quitar una variable o más al modelo; estas variables deben de ser independiente.

  • Si el valor es mayor que 2.25, existe evidencia de autocorrelación negativa, en otras palabras, el modelo se encuentra subestimado. Por lo que para corregirlo se debe de incluir una variable o más al modelo; estas variables deben de ser independiente.

Tenemos que nuestro valor Durbin-Watson es de 0.36155, no se acerca para nada a la unidad. Por lo que podemos decir que nuestro modelo de regresión lineal se encuentra con una autocorrelación positiva. En otras palabras, el modelo necesita explicarse a través de otras variables que sean independientes para que llegue a explicar mejor la predicción de la variable dependiente.

Conclusiones

Hemos aprendido a crear un modelo de regresión lineal simple a través de comandos en R. También logramos analizar algunos estadísticos descriptivos dentro de nuestro modelo de regresión lineal simple a través de un ejercicio.

Nota: Para un mejor modelo de regresión lineal simple debemos de tener en cuenta que los datos deben de ser:

  • Estacionarios si son series de tiempo económicas

  • Al menos deben de existir 40 observaciones o más para crear el modelo

  • Hacer las pruebas de hipótesis necesarias para que el modelo se encuentre mejor explicado a través de eliminación de variables independientes

  • Crear las series de tiempo a logaritmos naturales para que los coeficientes de regresores se encuentren como elasticidades.

*Ajustar los modelos de una forma segura sin que quede nada descuidado al hacer los análisis descriptivos.

Librerías

library(ggplot2)
library(ggfortify)
library(timeSeries)
## Loading required package: timeDate
library(tidyverse)
## -- Attaching packages ----------------------------------------------------------------------------- tidyverse 1.3.0 --
## v tibble  3.0.1     v dplyr   1.0.2
## v tidyr   1.1.0     v stringr 1.4.0
## v readr   1.3.1     v forcats 0.5.0
## v purrr   0.3.4
## -- Conflicts -------------------------------------------------------------------------------- tidyverse_conflicts() --
## x dplyr::filter() masks timeSeries::filter(), stats::filter()
## x dplyr::lag()    masks timeSeries::lag(), stats::lag()
library(lubridate)
## 
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
## 
##     date, intersect, setdiff, union
library(car)
## Loading required package: carData
## 
## Attaching package: 'car'
## The following object is masked from 'package:dplyr':
## 
##     recode
## The following object is masked from 'package:purrr':
## 
##     some
library(urca)
library(tseries)
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
library(astsa)
library(forecast)
## Registered S3 methods overwritten by 'forecast':
##   method                 from     
##   autoplot.Arima         ggfortify
##   autoplot.acf           ggfortify
##   autoplot.ar            ggfortify
##   autoplot.bats          ggfortify
##   autoplot.decomposed.ts ggfortify
##   autoplot.ets           ggfortify
##   autoplot.forecast      ggfortify
##   autoplot.stl           ggfortify
##   autoplot.ts            ggfortify
##   fitted.ar              ggfortify
##   fortify.ts             ggfortify
##   residuals.ar           ggfortify
## 
## Attaching package: 'forecast'
## The following object is masked from 'package:astsa':
## 
##     gas
library(foreign)
library(vars)
## Loading required package: MASS
## 
## Attaching package: 'MASS'
## The following object is masked from 'package:dplyr':
## 
##     select
## Loading required package: strucchange
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following object is masked from 'package:timeSeries':
## 
##     time<-
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## Loading required package: sandwich
## 
## Attaching package: 'strucchange'
## The following object is masked from 'package:stringr':
## 
##     boundary
## Loading required package: lmtest
library(lmtest)
library(mFilter)
library(dynlm)
library(nlme)
## 
## Attaching package: 'nlme'
## The following object is masked from 'package:forecast':
## 
##     getResponse
## The following object is masked from 'package:dplyr':
## 
##     collapse
library(quantmod)
## Loading required package: xts
## 
## Attaching package: 'xts'
## The following objects are masked from 'package:dplyr':
## 
##     first, last
## Loading required package: TTR
## Version 0.4-0 included new data defaults. See ?getSymbols.
library(NTS)
library(broom)
library(rugarch)
## Loading required package: parallel
## 
## Attaching package: 'rugarch'
## The following object is masked from 'package:purrr':
## 
##     reduce
## The following object is masked from 'package:stats':
## 
##     sigma
library(rmgarch)
## 
## Attaching package: 'rmgarch'
## The following objects are masked from 'package:xts':
## 
##     first, last
## The following objects are masked from 'package:dplyr':
## 
##     first, last
library(kableExtra)
## 
## Attaching package: 'kableExtra'
## The following object is masked from 'package:dplyr':
## 
##     group_rows
library(knitr)
library(MASS)
library(FinTS)
## 
## Attaching package: 'FinTS'
## The following object is masked from 'package:forecast':
## 
##     Acf
library(fGarch)
## Loading required package: fBasics
## 
## Attaching package: 'fBasics'
## The following object is masked from 'package:TTR':
## 
##     volatility
## The following object is masked from 'package:astsa':
## 
##     nyse
## The following object is masked from 'package:car':
## 
##     densityPlot
library(parallel)
library(openxlsx)
library(readxl)

Hay que mencionar que antes de instalar las librerías se deben de descargar a través del comando install.packages() cada una de las librerías. Una vez teniendo lo anterior podemos continuar con el ejercicio.