Alumno: Daniel Lorenzo Medina Salcedo
Correo: daniel.medina@cuantico.com
Asignatura: Estadística para Investigadores
Profesor: Dra. María Luisa Díez Platas
Doctorado: Ciencias de la Computación - UNIR
Fecha: Abril 2025
En línea: Ver en
Rpubs
economic <- read.csv("economic.csv")
head(economic)
| Country | wealth | education | freedom | tax_burden | unemployment | public_debt | gini |
|---|---|---|---|---|---|---|---|
| Afghanistan | 1918.60 | 0.398 | 154 | 5.0 | 8.5 | 8.3 | 27.8 |
| Albania | 11840.23 | 0.715 | 65 | 27.2 | 16.3 | 71.5 | 29.0 |
| Algeria | 15026.46 | 0.658 | 172 | 29.1 | 11.2 | 20.4 | 27.6 |
| Angola | 6844.43 | 0.482 | 164 | 24.0 | 6.6 | 71.9 | 42.7 |
| Argentina | 20047.49 | 0.808 | 144 | 31.3 | 6.6 | 51.3 | 42.4 |
| Armenia | 8620.98 | 0.730 | 44 | 21.3 | 16.8 | 51.8 | 32.4 |
summary(economic)
## Country wealth education freedom
## Length:150 Min. : 651.9 Min. :0.2060 Min. : 4.00
## Class :character 1st Qu.: 3882.9 1st Qu.:0.4933 1st Qu.: 45.50
## Mode :character Median : 11780.2 Median :0.6580 Median : 95.50
## Mean : 18024.9 Mean :0.6401 Mean : 91.89
## 3rd Qu.: 25568.6 3rd Qu.:0.7963 3rd Qu.:135.50
## Max. :127659.6 Max. :0.9390 Max. :179.00
## tax_burden unemployment public_debt gini
## Min. : 5.00 Min. : 0.200 Min. : 0.00 Min. :25.50
## 1st Qu.:15.95 1st Qu.: 4.800 1st Qu.: 34.55 1st Qu.:32.23
## Median :23.80 Median : 6.650 Median : 49.95 Median :37.75
## Mean :24.19 Mean : 8.491 Mean : 56.61 Mean :38.86
## 3rd Qu.:31.38 3rd Qu.:10.950 3rd Qu.: 71.45 3rd Qu.:44.45
## Max. :59.60 Max. :29.700 Max. :239.20 Max. :63.40
# 1. Calcula el histograma sin graficar (con frecuencias)
h <- hist(economic$wealth,
breaks = 10,
plot = FALSE,
include.lowest = TRUE)
# 2. Parámetros estadísticos
mu <- mean(economic$wealth, na.rm = TRUE)
sigma <- sd(economic$wealth, na.rm = TRUE)
# 3. Dibuja el histograma en frecuencia con espacio extra en Y
hist(economic$wealth,
breaks = h$breaks,
freq = TRUE,
col = "gray",
main = "Distribución de la riqueza entre las naciones",
xlab = "Riqueza",
ylab = "Frecuencia",
ylim = c(0, max(h$counts) * 1.2)) # 20% extra de espacio en Y
# 4. Anota el conteo de cada bin
text(x = h$mids, # centro de cada bin
y = h$counts, # altura de cada barra
labels = h$counts, # número de observaciones
pos = 3, # coloca el texto por encima
offset = 0.5, # separación adicional
cex = 0.8,
col = "blue")
# 5. Añade líneas de media y ±1σ
abline(v = mu, col = "red", lwd = 2)
abline(v = mu + sigma, col = "darkgreen", lwd = 2, lty = 2)
abline(v = mu - sigma, col = "darkgreen", lwd = 2, lty = 2)
# 6. Etiqueta las líneas de media y desviación estándar
y_pos <- max(h$counts) * c(1.15, 1.08, 1.08)
text(x = mu, y = y_pos[1],
labels = paste0("Media = ", round(mu, 2)),
col = "red", pos = 3)
text(x = mu + sigma, y = y_pos[2],
labels = paste0("+1σ = ", round(mu + sigma, 2)),
col = "darkgreen", pos = 3)
text(x = mu - sigma, y = y_pos[3],
labels = paste0("-1σ = ", round(mu - sigma, 2)),
col = "darkgreen", pos = 1) # pos=1 coloca el texto debajo de la línea
CONCLUSIONES:
plot(wealth ~ education, data=economic,
main="Dispersión de la riqueza por nivel educativo",
xlab="Índice educativo", ylab="Riqueza", pch=16)
simple.lm <- lm(wealth ~ education, data = economic)
abline(coef(simple.lm), col="blue", lwd=3)
CONCLUSIONES:
Se llama modelo nulo a ignorar completamente los predictores y estimar la respuesta como la media de las respuestas \(\bar y\). Para calcular \(\bar y\) podemos usar el comando:
mean.value <- mean(economic$wealth)
El MSE del modelo nulo nos calcula el error medio existente entre las muestras obtenidas \(y_i\) y la media de las respuestas \(\bar y\):
\[ \mathrm{MSE}_{\text{null}} \;=\; \frac{\displaystyle\sum_{i=1}^n (y_i - \bar y)^2}{n - 2} \]
Podemos calcular el MSE del modelo nulo con los comandos:
n <- length(economic$wealth)
mse.null <- sum((economic$wealth - mean.value)^2) / (n - 2)
mse.null
Obsérvese que el MSE no es inmediatamente claro para saber si el modelo se está comportando bien. Sin embargo, el coeficiente de determinación \(R^2\) sí que nos deja claro qué proporción de la variabilidad está siendo explicada por la recta de regresión. Para calcular este coeficiente usamos la fórmula:
\[ R^2 \;=\; 1 \;-\;\frac{\mathrm{MSE}}{\mathrm{MSE}_{\text{null}}} \]
Para ello ejecutamos en R:
r2 <- 1 - mse / mse.null
r2
mean.value <- mean(economic$wealth)
n <- length(economic$wealth)
mse.null <- sum((economic$wealth - mean.value)^2) / (n - 2)
mse.null
## [1] 388934349
predicted.values <- predict(simple.lm)
mse <- sum((economic$wealth - predicted.values)^2) / (n - 2)
mse
## [1] 195357939
r2 <- 1 - mse / mse.null
r2
## [1] 0.4977097
# Alternativa con summary()
summary(simple.lm)$r.squared
## [1] 0.4977097
Vamos a estudiar ahora la relación de la respuesta con el resto de
predictores. Empiece realizando un gráfico de dispersión para los demás
predictores. Si lo desea puede usar plot() para crear
gráficos de dispersión por pares, pero resulta más cómodo crear una
matriz de dispersión con el siguiente comando:
pairs(economic[c("wealth", "education", "freedom", "tax_burden", "unemployment", "public_debt", "gini")])
Es dificil establecer los cuatro mejores predictores, sin embargo se evidencian dos visualmente:
Una forma más cuantitativa de estudiar estas relaciones es calcular la matriz de correlación, que nos indica el nivel de relación entre dos variables. Para calcular la matriz de correlación puede utilizar el siguiente comando:
vars <- c("wealth", "education", "freedom", "tax_burden", "unemployment", "public_debt", "gini")
En esta matriz de correlación:
Tenga en cuenta que, si elevamos esta matriz \(r\) al cuadrado, obtenemos la matriz de coeficientes de determinación \(R^2\) para cada par de variables, es decir:
\[ r = \pm \sqrt{R^2} \]
El signo de \(r\) depende de la pendiente de la correlación:
vars <- c("wealth", "education", "freedom", "tax_burden", "unemployment", "public_debt", "gini")
r <- cor(economic[vars], use = "pairwise.complete.obs")
print(r)
## wealth education freedom tax_burden unemployment
## wealth 1.0000000 0.70548546 -0.64891722 0.3586740 -0.12753339
## education 0.7054855 1.00000000 -0.68513548 0.4796925 0.01198325
## freedom -0.6489172 -0.68513548 1.00000000 -0.3358040 0.05333221
## tax_burden 0.3586740 0.47969252 -0.33580398 1.0000000 0.34865674
## unemployment -0.1275334 0.01198325 0.05333221 0.3486567 1.00000000
## public_debt 0.1201342 0.16140088 -0.04723883 0.3229165 0.21006959
## gini -0.3118401 -0.37723200 0.25795794 -0.2553436 0.23029792
## public_debt gini
## wealth 0.12013420 -0.3118401
## education 0.16140088 -0.3772320
## freedom -0.04723883 0.2579579
## tax_burden 0.32291646 -0.2553436
## unemployment 0.21006959 0.2302979
## public_debt 1.00000000 -0.1286555
## gini -0.12865549 1.0000000
# 2. Mapa de calor con corrplot (necesita instalar el paquete corrplot)
library(corrplot)
# Mapa de calor de correlaciones con coeficientes sobre la diagonal
corrplot(r,
method = "color", # tipo de gráfico: color
type = "full", # solo triángulo superior
addCoef.col = "black", # coeficientes en negro
tl.col = "darkblue", # etiquetas en azul oscuro
tl.srt = 45, # rotación de etiquetas
number.cex = 0.7, # tamaño de los números
title = "Matriz de Correlaciones",
mar = c(0,0,1,0)) # márgenes para el título
Los cuatro mejores predictores son:
Tenga en cuenta que tanto la matriz de dispersión como la matriz de correlación no son multidimensionales, sino que examinan dos variables cada vez. Aun así, nos dan una buena idea de qué variables están más relacionadas.
Recordar que, para obtener los parámetros de la recta de regresión, podíamos calcularlos como:
\[ \boldsymbol{\beta} = \bigl(X^{T} X\bigr)^{-1} X^{T} Y \]
Los siguientes comandos permiten calcular los parámetros de nuestro ejemplo:
y <- as.matrix(economic$wealth)
x <- as.matrix(economic[c("education","freedom","tax_burden", "unemployment","public_debt","gini")])
x <- cbind(Intercept = 1, x)
b <- solve(t(x) %*% x) %*% t(x) %*% y
colnames(b) <- "estimate"
print(b)
## estimate
## Intercept -4507.677062
## education 50493.608745
## freedom -114.355086
## tax_burden 156.872434
## unemployment -495.201222
## public_debt 23.013179
## gini -4.418581
Una forma alternativa de obtener estos parámetros es usando el
comando summary() sobre el modelo de regresión generado por
lm():
multiple.lm <- lm(wealth ~ education + freedom + tax_burden + unemployment + public_debt + gini, data = economic)
summary(multiple.lm)
##
## Call:
## lm(formula = wealth ~ education + freedom + tax_burden + unemployment +
## public_debt + gini, data = economic)
##
## Residuals:
## Min 1Q Median 3Q Max
## -22893 -7015 -2013 4203 98420
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -4507.677 10516.167 -0.429 0.668828
## education 50493.609 9181.856 5.499 1.71e-07 ***
## freedom -114.355 29.165 -3.921 0.000136 ***
## tax_burden 156.872 141.349 1.110 0.268939
## unemployment -495.201 207.037 -2.392 0.018064 *
## public_debt 23.013 35.309 0.652 0.515594
## gini -4.419 146.847 -0.030 0.976038
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 13160 on 143 degrees of freedom
## Multiple R-squared: 0.5697, Adjusted R-squared: 0.5516
## F-statistic: 31.55 on 6 and 143 DF, p-value: < 2.2e-16
En clase hemos visto que obtenemos el p‑valor de
cada parámetro en la columna Pr(>|t|) del comando
summary(). Utilice este comando para decidir qué
predictores contribuyen con un nivel de significancia del 95 % al nivel
de riqueza de las naciones en nuestro modelo.
Respuesta: No podemos concluir que la respuesta es proporcional a los predictores. Aunque el modelo es estadísticamente significativo en su conjunto (p‑valor del modelo: < 2.2e-16), no todos los predictores muestran una relación significativa individualmente con la variable respuesta (wealth).
Observando los p‑valores individuales:
Por tanto, la respuesta no es completamente proporcional a todos los predictores, aunque sí lo es respecto a algunos de ellos.
Los predictores correlacionados con la respuesta pueden ser causas o efectos:
Efectos:
Otra forma de identificar causas y eliminar colinealidades es usar el Akaike Information Criterion (AIC). Los predictores cuya eliminación no reduce la información son candidatos a causas, ya que no actúan como efectos. Para ello, ejecute el siguiente comando:
step(object = multiple.lm)
## Start: AIC=2852.35
## wealth ~ education + freedom + tax_burden + unemployment + public_debt +
## gini
##
## Df Sum of Sq RSS AIC
## - gini 1 156835 2.4771e+10 2850.3
## - public_debt 1 73586880 2.4845e+10 2850.8
## - tax_burden 1 213360948 2.4984e+10 2851.6
## <none> 2.4771e+10 2852.3
## - unemployment 1 991008289 2.5762e+10 2856.2
## - freedom 1 2663212873 2.7434e+10 2865.7
## - education 1 5238666178 3.0010e+10 2879.1
##
## Step: AIC=2850.35
## wealth ~ education + freedom + tax_burden + unemployment + public_debt
##
## Df Sum of Sq RSS AIC
## - public_debt 1 74784773 2.4846e+10 2848.8
## - tax_burden 1 223818928 2.4995e+10 2849.7
## <none> 2.4771e+10 2850.3
## - unemployment 1 1117007358 2.5888e+10 2855.0
## - freedom 1 2664006230 2.7435e+10 2863.7
## - education 1 5507700743 3.0279e+10 2878.5
##
## Step: AIC=2848.8
## wealth ~ education + freedom + tax_burden + unemployment
##
## Df Sum of Sq RSS AIC
## - tax_burden 1 302335967 2.5148e+10 2848.6
## <none> 2.4846e+10 2848.8
## - unemployment 1 1068855661 2.5915e+10 2853.1
## - freedom 1 2607422083 2.7453e+10 2861.8
## - education 1 5637973470 3.0484e+10 2877.5
##
## Step: AIC=2848.61
## wealth ~ education + freedom + unemployment
##
## Df Sum of Sq RSS AIC
## <none> 2.5148e+10 2848.6
## - unemployment 1 790819703 2.5939e+10 2851.3
## - freedom 1 2699992646 2.7848e+10 2861.9
## - education 1 7676348394 3.2825e+10 2886.6
##
## Call:
## lm(formula = wealth ~ education + freedom + unemployment, data = economic)
##
## Coefficients:
## (Intercept) education freedom unemployment
## -3624.2 55342.1 -114.5 -382.5
Predictores eliminados (Efectos):
step_model <- lm(wealth ~ education + freedom + unemployment, data = economic)
summary(step_model)$adj.r.squared
## [1] 0.5541334
El modelo ajustado (tiene R2≈0.55), indicando que la reducción de variables no afecta la capacidad explicativa y en cambio se gana simplicidad.