# Limpiar el entorno
rm(list = ls())

# Cargar las librerías necesarias


library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.1     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.1
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(ggplot2)
library(ggpubr)
library(kableExtra)
## 
## Attaching package: 'kableExtra'
## 
## The following object is masked from 'package:dplyr':
## 
##     group_rows
library(readxl)

1. Derive OLS utilizando las condiciones de primer orden que surgen de

\(\sum(y_i-ar{y})^2 = 0\)

$ ewpage$

2. Genere sus propios datos para probar la teoría:

Asuma que la ecuación poblacional está dada por \(y_i=15+7X_i+\mu_i\), con el término estocástico (\(\mu\)) distribuido normalmente con media de cero. \(X\) toma valores aleatorios.

a. Generar una muestra aleatoria de 100 observaciones

set.seed(123)
x <- rnorm(100)
error <- rnorm(100, mean=0, sd=10)
y <- 15 + (7 * x) + error

b. Scatterplot de x e y

plot(x, y, main="Scatterplot de x e y", xlab="x", ylab="y", pch=19, col="blue")

c. Estimar la regresión

reg <- lm(y ~ x)
summary(reg)
## 
## Call:
## lm(formula = y ~ x)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -19.073  -6.835  -0.875   5.806  32.904 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  13.9720     0.9755  14.323  < 2e-16 ***
## x             6.4753     1.0688   6.059 2.55e-08 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 9.707 on 98 degrees of freedom
## Multiple R-squared:  0.2725, Adjusted R-squared:  0.2651 
## F-statistic: 36.71 on 1 and 98 DF,  p-value: 2.551e-08
anova(reg)
# Calcular SSE
sse <- sum((fitted(reg) - y)^2)
sse
## [1] 9234.413

d. Interpretar el coeficiente de regresión

x_mean <- mean(x)
y_pred <- 13.972 + 6.475 * x_mean
y_pred
## [1] 14.55738

f. Calcular manualmente \(R^2\)

# Calcular SST
y_mean <- mean(y)
sst <- sum((y - y_mean)^2)

# Calcular SSR
ssr <- sst - sse

# Calcular R^2
Rcuad <- ssr / sst
Rcuad
## [1] 0.2724892

3. Creando sus propios datos para indagar \(R^2\)

a. Ejecutar código y calcular R^2

set.seed(123)
x <- runif(100)
error <- rnorm(100, mean = 0, sd = 5)
y <- 2 + (5 * x) + error

# Regresión
regresion <- lm(y ~ x)
summary(regresion)
## 
## Call:
## lm(formula = y ~ x)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -11.1899  -3.0661  -0.0987   2.9817  11.0861 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)   
## (Intercept)   1.9552     0.9803   1.995  0.04887 * 
## x             4.5508     1.7091   2.663  0.00906 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 4.846 on 98 degrees of freedom
## Multiple R-squared:  0.06747,    Adjusted R-squared:  0.05795 
## F-statistic:  7.09 on 1 and 98 DF,  p-value: 0.009062
# Scatterplot
plot(x, y, main = "Main title", xlab = "X axis title", ylab = "Y axis title", pch = 19, frame = FALSE)
abline(lm(y ~ x), col = "blue")

# Calcular SSE, SST, SSR y R^2
sse <- sum((fitted(regresion) - y)^2)
sst <- sum((y - mean(y))^2)
ssr <- sst - sse
Rcuad <- ssr / sst

# Imprimir resultados
ssr
## [1] 166.5307
Rcuad
## [1] 0.06746591

b. Modificar el código con \(SD=15\)

set.seed(123)
x <- runif(100)
error <- rnorm(100, mean = 0, sd = 15)
y <- 2 + (5 * x) + error

# Regresión
regresion <- lm(y ~ x)
summary(regresion)
## 
## Call:
## lm(formula = y ~ x)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -33.570  -9.198  -0.296   8.945  33.258 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)
## (Intercept)    1.866      2.941   0.634    0.527
## x              3.653      5.127   0.712    0.478
## 
## Residual standard error: 14.54 on 98 degrees of freedom
## Multiple R-squared:  0.005152,   Adjusted R-squared:  -0.005 
## F-statistic: 0.5075 on 1 and 98 DF,  p-value: 0.4779
# Calcular R^2
sse <- sum((fitted(regresion) - y)^2)
sst <- sum((y - mean(y))^2)
ssr <- sst - sse
Rcuad <- ssr / sst

# Imprimir resultados
ssr
## [1] 107.2749
Rcuad
## [1] 0.005151549

4. Regresión lineal con datos de Wooldridge

install.packages("wooldridge")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.4'
## (as 'lib' is unspecified)
library(wooldridge)
data("wage1")

# Ajustar modelo
wagereg <- lm(lwage ~ educ, data = wage1)
summary(wagereg)
## 
## Call:
## lm(formula = lwage ~ educ, data = wage1)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -2.21158 -0.36393 -0.07263  0.29712  1.52339 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 0.583773   0.097336   5.998 3.74e-09 ***
## educ        0.082744   0.007567  10.935  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.4801 on 524 degrees of freedom
## Multiple R-squared:  0.1858, Adjusted R-squared:  0.1843 
## F-statistic: 119.6 on 1 and 524 DF,  p-value: < 2.2e-16
# Cálculo de SSE, SST, SSR
observed <- wage1$lwage
predicted <- fitted(wagereg)
mean_observed <- mean(observed)
sse <- sum((observed - predicted)^2)
sst <- sum((observed - mean_observed)^2)
ssr <- sum((predicted - mean_observed)^2)

# Calcular R^2
Rcuad <- ssr / sst
Rcuad
## [1] 0.1858065