Universidad Pontificia Bolivariana
Regresión lineal, semestre 2026-20
Integrantes
Katerine Correa Lugo
Tomás Wrueta Lugo
Nicolás Sánchez Espitia
Alejandro Castillo Villadiego
Profesor
Delio Salgado Chamorro
Fecha de entrega
10 de noviembre de 2026
La resistencia a la compresión es la propiedad que más se utiliza para evaluar la calidad del concreto, porque de ella depende que una estructura soporte las cargas para las que fue diseñada. Su valor no se conoce en el momento de preparar la mezcla: se obtiene rompiendo probetas en el laboratorio después de un tiempo de curado, lo que hace lento y costoso el control de calidad.
Este trabajo ajusta un modelo de regresión lineal múltiple para
explicar la resistencia a la compresión (csMPa, en MPa) a
partir de la composición de la mezcla y de la edad de la probeta. Un
modelo adecuado permitiría estimar la resistencia esperada de una mezcla
antes de ensayarla y conocer qué componentes la aumentan y cuáles la
disminuyen.
La regresión lineal múltiple es apropiada porque la variable de
interés es continua, se dispone de varias variables explicativas
cuantitativas y se quiere medir el aporte de cada una manteniendo
constantes las demás. Los datos corresponden al conjunto Concrete
Compressive Strength de Yeh (1998), disponible en Kaggle (ver
referencias), en el archivo Concrete_Data_Yeh.csv. Cada
fila es una mezcla de concreto ensayada a una edad determinada.
La variable respuesta es la resistencia a la compresión y las ocho variables regresoras son los componentes de la mezcla y la edad.
| Variable | Descripción | Unidad | Rol |
|---|---|---|---|
csMPa |
Resistencia a la compresión | MPa | Respuesta (\(y\)) |
cement |
Cemento | kg/m³ | Regresora \(x_1\) |
slag |
Escoria de alto horno | kg/m³ | Regresora \(x_2\) |
flyash |
Ceniza volante | kg/m³ | Regresora \(x_3\) |
water |
Agua | kg/m³ | Regresora \(x_4\) |
superplasticizer |
Superplastificante | kg/m³ | Regresora \(x_5\) |
coarseaggregate |
Agregado grueso | kg/m³ | Regresora \(x_6\) |
fineaggregate |
Agregado fino | kg/m³ | Regresora \(x_7\) |
age |
Edad de la muestra | días | Regresora \(x_8\) |
Todas las variables son cuantitativas, por lo que no hay variables cualitativas que requieran tratamiento mediante variables indicadoras.
Primero se cargan los datos y se definen las variables. Después se revisan los estadísticos básicos, los valores faltantes y las correlaciones.
library(nortest)
library(lmtest)
library(car)
library(sandwich)
Concreto <- read.csv("Concrete_Data_Yeh.csv")
csMPa <- Concreto$csMPa
cement <- Concreto$cement
slag <- Concreto$slag
flyash <- Concreto$flyash
water <- Concreto$water
superplasticizer <- Concreto$superplasticizer
coarseaggregate <- Concreto$coarseaggregate
fineaggregate <- Concreto$fineaggregate
age <- Concreto$age
n <- length(csMPa)
k <- 8## cement slag flyash water
## Min. :102.0 Min. : 0.0 Min. : 0.00 Min. :121.8
## 1st Qu.:192.4 1st Qu.: 0.0 1st Qu.: 0.00 1st Qu.:164.9
## Median :272.9 Median : 22.0 Median : 0.00 Median :185.0
## Mean :281.2 Mean : 73.9 Mean : 54.19 Mean :181.6
## 3rd Qu.:350.0 3rd Qu.:142.9 3rd Qu.:118.30 3rd Qu.:192.0
## Max. :540.0 Max. :359.4 Max. :200.10 Max. :247.0
## superplasticizer coarseaggregate fineaggregate age
## Min. : 0.000 Min. : 801.0 Min. :594.0 Min. : 1.00
## 1st Qu.: 0.000 1st Qu.: 932.0 1st Qu.:731.0 1st Qu.: 7.00
## Median : 6.400 Median : 968.0 Median :779.5 Median : 28.00
## Mean : 6.205 Mean : 972.9 Mean :773.6 Mean : 45.66
## 3rd Qu.:10.200 3rd Qu.:1029.4 3rd Qu.:824.0 3rd Qu.: 56.00
## Max. :32.200 Max. :1145.0 Max. :992.6 Max. :365.00
## csMPa
## Min. : 2.33
## 1st Qu.:23.71
## Median :34.45
## Mean :35.82
## 3rd Qu.:46.13
## Max. :82.60
## cement slag flyash water
## 0 0 0 0
## superplasticizer coarseaggregate fineaggregate age
## 0 0 0 0
## csMPa
## 0
## cement slag flyash water superplasticizer coarseaggregate
## cement 1.000 -0.275 -0.397 -0.082 0.092 -0.109
## slag -0.275 1.000 -0.324 0.107 0.043 -0.284
## flyash -0.397 -0.324 1.000 -0.257 0.378 -0.010
## water -0.082 0.107 -0.257 1.000 -0.658 -0.182
## superplasticizer 0.092 0.043 0.378 -0.658 1.000 -0.266
## coarseaggregate -0.109 -0.284 -0.010 -0.182 -0.266 1.000
## fineaggregate -0.223 -0.282 0.079 -0.451 0.223 -0.178
## age 0.082 -0.044 -0.154 0.278 -0.193 -0.003
## csMPa 0.498 0.135 -0.106 -0.290 0.366 -0.165
## fineaggregate age csMPa
## cement -0.223 0.082 0.498
## slag -0.282 -0.044 0.135
## flyash 0.079 -0.154 -0.106
## water -0.451 0.278 -0.290
## superplasticizer 0.223 -0.193 0.366
## coarseaggregate -0.178 -0.003 -0.165
## fineaggregate 1.000 -0.156 -0.167
## age -0.156 1.000 0.329
## csMPa -0.167 0.329 1.000
Principales comportamientos. La base tiene 1030
observaciones y 9 variables, con 0 valores faltantes. La resistencia
tiene una media de 35.82 MPa y una desviación estándar de 16.71 MPa, con
valores entre 2.33 y 82.6 MPa, de modo que hay mezclas de resistencia
muy distinta. Las variables slag, flyash y
superplasticizer tienen muchos valores iguales a cero (45.7
%, 55 % y 36.8 % de las mezclas, respectivamente). Esos ceros no son
datos faltantes: indican que la mezcla no llevó ese componente. La edad
tiene una distribución muy asimétrica: su media es 45.7 días, su mediana
28 y su máximo 365, porque la mayoría de los ensayos se hicieron a
edades tempranas y solo unos pocos a edades largas. En la matriz de
dispersión se observa además que age toma pocos valores
distintos, ya que los ensayos se programan a edades estándar.
Entre las regresoras, la correlación lineal más alta con la resistencia es la de cement (0.498) y la más baja es la de water (-0.29). Estas correlaciones son solo una primera aproximación, porque no controlan el efecto de las demás variables; ese control lo hace el modelo de regresión.
El modelo de regresión lineal múltiple expresa la resistencia como una combinación lineal de las ocho regresoras más un error aleatorio. Cada coeficiente \(\beta_j\) mide el cambio promedio de la resistencia cuando la variable \(x_j\) aumenta una unidad y las demás permanecen constantes. Los parámetros se estiman por mínimos cuadrados ordinarios (MCO), que escogen los valores que hacen mínima la suma de los cuadrados de los residuales.
El modelo general, para \(i = 1, \dots, n\), es
\[csMPa_i = \beta_0 + \beta_1\, cement_i + \beta_2\, slag_i + \beta_3\, flyash_i + \beta_4\, water_i + \beta_5\, superplasticizer_i + \beta_6\, coarseaggregate_i + \beta_7\, fineaggregate_i + \beta_8\, age_i + \varepsilon_i, \qquad \varepsilon_i \sim N(0, \sigma^2)\]
En forma matricial, \(\mathbf{y} = \mathbf{X}\boldsymbol{\beta} + \boldsymbol{\varepsilon}\), y el estimador de MCO es
\[\hat{\boldsymbol{\beta}} = (\mathbf{X}^\top \mathbf{X})^{-1}\mathbf{X}^\top \mathbf{y}.\]
modelo <- lm(csMPa ~ cement + slag + flyash + water + superplasticizer +
coarseaggregate + fineaggregate + age)
summary(modelo)##
## Call:
## lm(formula = csMPa ~ cement + slag + flyash + water + superplasticizer +
## coarseaggregate + fineaggregate + age)
##
## Residuals:
## Min 1Q Median 3Q Max
## -28.654 -6.302 0.703 6.569 34.450
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -23.331214 26.585504 -0.878 0.380372
## cement 0.119804 0.008489 14.113 < 2e-16 ***
## slag 0.103866 0.010136 10.247 < 2e-16 ***
## flyash 0.087934 0.012583 6.988 5.02e-12 ***
## water -0.149918 0.040177 -3.731 0.000201 ***
## superplasticizer 0.292225 0.093424 3.128 0.001810 **
## coarseaggregate 0.018086 0.009392 1.926 0.054425 .
## fineaggregate 0.020190 0.010702 1.887 0.059491 .
## age 0.114222 0.005427 21.046 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 10.4 on 1021 degrees of freedom
## Multiple R-squared: 0.6155, Adjusted R-squared: 0.6125
## F-statistic: 204.3 on 8 and 1021 DF, p-value: < 2.2e-16
La ecuación estimada es
\[\widehat{csMPa} = -23.3312 +0.1198\,cement +0.1039\,slag +0.0879\,flyash -0.1499\,water +0.2922\,superplasticizer +0.0181\,coarseaggregate +0.0202\,fineaggregate +0.1142\,age\]
Los coeficientes de cement, slag, flyash, superplasticizer, coarseaggregate, fineaggregate, age son positivos, de modo que aumentar esas cantidades (o la edad) eleva la resistencia estimada. Los coeficientes de water son negativos, de modo que aumentar esas cantidades la reduce. En todos los casos el efecto corresponde a un aumento de 1 kg/m³ en los componentes o de 1 día en la edad, con las demás variables constantes.
El intercepto estimado es -23.33 MPa y corresponde a una mezcla con todas las cantidades en cero. Esa situación no existe en los datos (por ejemplo, el agua mínima observada es de 121.8 kg/m³), por lo que el intercepto sirve para ajustar el modelo y no tiene interpretación práctica. Además, los componentes de una mezcla no varían de forma independiente en la realidad, de modo que la expresión “manteniendo constantes las demás” debe leerse con cuidado.
El modelo tiene un \(R^2\) de 0.6155, un \(R^2\) ajustado de 0.6125 y un error estándar residual de 10.4 MPa.
Se estimó el modelo completo con las ocho regresoras, que explica el 61.6 % de la variabilidad de la resistencia del concreto. Esta ecuación es el modelo base sobre el cual se desarrollan las pruebas y los diagnósticos de los apartados siguientes.
La prueba F global responde a una primera pregunta: ¿el modelo, en conjunto, explica la resistencia mejor que un modelo sin regresoras, que solo usaría la media? Para resolverla se separa la variabilidad total de la resistencia en dos partes: la que explica la regresión y la que queda en los residuales. Esa información se resume en la tabla de análisis de varianza (ANOVA). Se trabaja con un nivel de significancia \(\alpha = 0.05\).
\[H_0: \beta_1 = \beta_2 = \cdots = \beta_8 = 0 \qquad \text{vs.} \qquad H_1: \text{al menos un } \beta_j \neq 0, \; j = 1, \dots, 8\]
\[SST = \sum_{i=1}^{n}(y_i - \bar{y})^2, \qquad SSE = \sum_{i=1}^{n}(y_i - \hat{y}_i)^2, \qquad SSR = SST - SSE\]
\[MSR = \frac{SSR}{k}, \qquad MSE = \frac{SSE}{n - k - 1}, \qquad F_0 = \frac{MSR}{MSE}\]
Se rechaza \(H_0\) si el estadístico de prueba supera al estadístico teórico, es decir, si \(F_0 > F_{\alpha;\,k,\,n-k-1}\).
SST <- sum((csMPa - mean(csMPa))^2)
SSE <- sum(modelo$residuals^2)
SSR <- SST - SSE
gl_reg <- k
gl_res <- n - k - 1
gl_tot <- n - 1
CMR <- SSR / gl_reg
CME <- SSE / gl_res
F0 <- CMR / CME
F_teo <- qf(0.95, gl_reg, gl_res)
p_F <- pf(F0, gl_reg, gl_res, lower.tail = FALSE)
tabla_anova <- data.frame(
Fuente = c("Regresión", "Residual", "Total"),
Suma_cuadrados = c(SSR, SSE, SST),
gl = c(gl_reg, gl_res, gl_tot),
Cuadrado_medio = c(CMR, CME, NA),
F0 = c(F0, NA, NA))
knitr::kable(tabla_anova, digits = 4, na = "",
caption = "Tabla 2. Análisis de varianza del modelo completo")| Fuente | Suma_cuadrados | gl | Cuadrado_medio | F0 |
|---|---|---|---|---|
| Regresión | 176762.0 | 8 | 22095.2542 | 204.3167 |
| Residual | 110413.2 | 1021 | 108.1422 | NA |
| Total | 287175.2 | 1029 | NA | NA |
## F_prueba F_teorico p_valor
## 2.043167e+02 1.947456e+00 6.285978e-206
El estadístico de prueba es \(F_0 =\) 204.32 y el estadístico teórico es \(F_{0.05;\,8,\,1021} =\) 1.9475. Como el estadístico de prueba F0 es mayor que el estadístico teórico y el p-valor es < 1e-04, menor que 0.05, se rechaza H0.
Con un nivel de significancia del 5 %, hay evidencia de que al menos una de las variables, ya sea un componente de la mezcla o la edad, está relacionada con la resistencia del concreto. Esto significa que el modelo completo explica la resistencia mejor que su promedio.
Una vez establecido que el modelo es significativo en conjunto, interesa saber qué variables aportan de manera individual. La prueba t evalúa, para cada coeficiente, si su valor es distinto de cero cuando las demás variables ya están incluidas en el modelo. Se incluye también el intercepto y se usa \(\alpha = 0.05\).
\[H_0: \beta_j = 0 \qquad \text{vs.} \qquad H_1: \beta_j \neq 0, \qquad j = 0, 1, \dots, 8\]
\[\text{ee}(\hat{\beta}_j) = \sqrt{MSE\,[(\mathbf{X}^\top\mathbf{X})^{-1}]_{jj}}, \qquad t_0 = \frac{\hat{\beta}_j}{\text{ee}(\hat{\beta}_j)}\]
Se rechaza \(H_0\) si el estadístico de prueba supera al estadístico teórico, es decir, si \(|t_0| > t_{\alpha/2;\,n-k-1}\).
tab_coef <- summary(modelo)$coefficients
gl <- n - k - 1
t_crit <- qt(0.975, gl)
inf_t <- data.frame(
Coeficiente = rownames(tab_coef),
Estimado = tab_coef[, "Estimate"],
Error_est = tab_coef[, "Std. Error"],
t0 = tab_coef[, "t value"],
t_teorico = t_crit,
p_valor = format.pval(tab_coef[, "Pr(>|t|)"], digits = 4, eps = 0.0001),
Decision = ifelse(abs(tab_coef[, "t value"]) > t_crit,
"Rechaza H0", "No rechaza H0"),
row.names = NULL)
knitr::kable(inf_t, digits = 4,
caption = "Tabla 3. Pruebas t individuales sobre los coeficientes")| Coeficiente | Estimado | Error_est | t0 | t_teorico | p_valor | Decision |
|---|---|---|---|---|---|---|
| (Intercept) | -23.3312 | 26.5855 | -0.8776 | 1.9623 | 0.3803719 | No rechaza H0 |
| cement | 0.1198 | 0.0085 | 14.1129 | 1.9623 | < 1e-04 | Rechaza H0 |
| slag | 0.1039 | 0.0101 | 10.2474 | 1.9623 | < 1e-04 | Rechaza H0 |
| flyash | 0.0879 | 0.0126 | 6.9882 | 1.9623 | < 1e-04 | Rechaza H0 |
| water | -0.1499 | 0.0402 | -3.7314 | 1.9623 | 0.0002009 | Rechaza H0 |
| superplasticizer | 0.2922 | 0.0934 | 3.1279 | 1.9623 | 0.0018102 | Rechaza H0 |
| coarseaggregate | 0.0181 | 0.0094 | 1.9257 | 1.9623 | 0.0544248 | No rechaza H0 |
| fineaggregate | 0.0202 | 0.0107 | 1.8867 | 1.9623 | 0.0594908 | No rechaza H0 |
| age | 0.1142 | 0.0054 | 21.0464 | 1.9623 | < 1e-04 | Rechaza H0 |
El estadístico teórico es \(t_{0.025;\,1021} =\) 1.9623. Se rechaza \(H_0\) cuando el estadístico de prueba \(|t_0|\) supera al estadístico teórico, lo que equivale a un p-valor menor que 0.05. Con este criterio se rechaza \(H_0\) para 6 de los 8 coeficientes de las variables regresoras.
Con las demás variables en el modelo, tienen un efecto significativo
y positivo sobre la resistencia cement, slag, flyash, superplasticizer,
age, de modo que un aumento en estas cantidades incrementa la
resistencia media del concreto. Tienen un efecto significativo y
negativo water, de modo que un aumento en estas cantidades la reduce. La
magnitud de cada efecto, en MPa por unidad, es la de la columna
Estimado. Las variables coarseaggregate, fineaggregate no
resultan significativas. Esto no quiere decir que no influyan en la
resistencia, sino que, con las demás variables en el modelo, su aporte
adicional no se distingue de cero.
También conviene distinguir entre significancia estadística e importancia práctica. Con 1030 observaciones, incluso efectos pequeños pueden resultar significativos, por lo que el tamaño del coeficiente debe leerse junto con el p-valor y con el rango real de cada variable.
En conclusión, con un nivel de significancia del 5 %, 6 de las 8 variables regresoras son significativas en el modelo completo. Las que no lo son se vuelven a evaluar en la selección de variables del apartado 8.
Las pruebas t y F de los apartados anteriores se construyen suponiendo que los errores del modelo siguen una distribución normal, \(\varepsilon_i \sim N(0, \sigma^2)\). Como los errores no se observan, el supuesto se verifica con los residuales, \(e_i = y_i - \hat{y}_i\). Primero se examina la forma de su distribución con gráficos y después se contrasta con tres pruebas formales: Lilliefors, Anderson-Darling y Shapiro-Wilk.
residuales <- modelo$residuals
qqnorm(residuales, main = "Gráfico Q-Q de los residuales")
qqline(residuales, col = "red")hist(residuales, breaks = 30, col = "green",
main = "Histograma de residuales", xlab = "Residuales")En el gráfico Q-Q se comparan los cuantiles de los residuales con los de una normal: si el supuesto se cumple, los puntos se ubican sobre la línea roja. Las desviaciones respecto a la línea, sobre todo en los extremos, indican que las colas de la distribución se apartan de la normal. En el histograma se espera una forma simétrica y de campana.
Hipótesis.
\[H_0: \varepsilon_i \sim \text{Normal} \qquad \text{vs.} \qquad H_1: \varepsilon_i \not\sim \text{Normal}\]
con \(\alpha = 0.05\).
Estadísticos. Con los residuales ordenados \(e_{(1)} \le \cdots \le e_{(n)}\) y \(z_{(i)} = (e_{(i)} - \bar{e})/s_e\), las tres pruebas usan los siguientes estadísticos.
Lilliefors (Kolmogorov-Smirnov con media y varianza estimadas):
\[D = \max_i \left\{ \frac{i}{n} - \Phi(z_{(i)}),\; \Phi(z_{(i)}) - \frac{i-1}{n} \right\}\]
Con \(n > 30\) y \(\alpha = 0.05\), el estadístico teórico aproximado es \(D_{teo} = 0.886/\sqrt{n}\) (Lilliefors, 1967), y se rechaza \(H_0\) si el estadístico de prueba supera al teórico, es decir, si \(D > D_{teo}\).
Anderson-Darling (Anderson y Darling, 1952):
\[A^2 = -n - \frac{1}{n}\sum_{i=1}^{n}(2i-1)\left[\ln \Phi(z_{(i)}) + \ln\left(1 - \Phi(z_{(n+1-i)})\right)\right]\]
Shapiro-Wilk (Shapiro y Wilk, 1965):
\[W = \frac{\left(\sum_{i=1}^{n} a_i\, e_{(i)}\right)^2}{\sum_{i=1}^{n}(e_i - \bar{e})^2}\]
Para Anderson-Darling y Shapiro-Wilk no hay un único estadístico
teórico de tabla, por lo que la decisión se toma con el p-valor: se
rechaza \(H_0\) si es menor que \(\alpha\). Las tres pruebas se aplican con
el paquete nortest (Gross y Ligges, 2015).
Código y resultados.
##
## Lilliefors (Kolmogorov-Smirnov) normality test
##
## data: residuales
## D = 0.033815, p-value = 0.007526
##
## Anderson-Darling normality test
##
## data: residuales
## A = 1.2398, p-value = 0.003149
##
## Shapiro-Wilk normality test
##
## data: residuales
## W = 0.99532, p-value = 0.002993
El estadístico de prueba de Lilliefors y su estadístico teórico se calculan de la siguiente manera:
ord <- sort(residuales)
z <- (ord - mean(residuales)) / sd(residuales)
Fz <- pnorm(z)
i <- 1:n
D <- max(pmax(i / n - Fz, Fz - (i - 1) / n))
Dcrit <- 0.886 / sqrt(n)
data.frame(D_manual = D, D_lillie_test = unname(lt$statistic),
D_teorico = Dcrit, p_valor = lt$p.value)## D_manual D_lillie_test D_teorico p_valor
## 1 0.03381455 0.03381455 0.02760674 0.007525946
Para Lilliefors, el estadístico de prueba es \(D =\) 0.0338 y el estadístico teórico es 0.0276. Como el estadístico de prueba D es mayor que el estadístico teórico, se rechaza H0. Los p-valores de las pruebas de Lilliefors, Anderson-Darling y Shapiro-Wilk son 0.007526, 0.003149 y 0.002993, respectivamente. Los tres son menores que 0.05, por lo que se rechaza H0 en las tres pruebas.
Las pruebas indican que los residuales no siguen una distribución normal; es decir, los errores que comete el modelo al predecir la resistencia del concreto no se distribuyen de forma normal. Por esta razón, los p-valores y la significancia de los apartados 2 y 3 deben tomarse con cautela. Como el supuesto no se cumple, se recomienda transformar alguna variable, en particular la edad, que es muy asimétrica; revisar la presencia de observaciones atípicas o influyentes; y emplear errores estándar robustos para la inferencia. Estas tres acciones se aplican en el apartado 7, con una transformación logarítmica de la edad, la distancia de Cook y los errores estándar HC3.
El modelo supone que los errores tienen la misma varianza en todas las observaciones, \(\text{Var}(\varepsilon_i) = \sigma^2\), lo que se conoce como homocedasticidad. Si la varianza cambia, las estimaciones de los coeficientes siguen siendo insesgadas, pero los errores estándar y las pruebas dejan de ser confiables. El supuesto se revisa con un gráfico de los residuales contra los valores ajustados y con la prueba de Breusch-Pagan (Breusch y Pagan, 1979), en su versión studentizada y en la original.
ajustados <- modelo$fitted.values
plot(ajustados, residuales, pch = 20, main = "Residuales vs valores ajustados",
xlab = "Valores ajustados", ylab = "Residuales")
abline(h = 0, col = "red")Si la varianza es constante, los puntos forman una banda de ancho parejo alrededor de cero, sin forma de embudo ni de curva.
Hipótesis.
\[H_0: \text{Var}(\varepsilon_i) = \sigma^2 \text{ para todo } i \qquad \text{vs.} \qquad H_1: \text{la varianza depende de las regresoras}\]
con \(\alpha = 0.05\).
Estadístico. Se ajusta una regresión auxiliar de \(e_i^2\) sobre las regresoras y se calcula
\[LM = n\,R^2_{aux} \;\overset{H_0}{\sim}\; \chi^2_{k}\]
La versión original supone errores normales; la studentizada (Koenker, 1981) no necesita ese supuesto. Se rechaza \(H_0\) si el estadístico de prueba supera al estadístico teórico, es decir, si \(LM > \chi^2_{\alpha;\,k}\).
Código y resultados.
##
## studentized Breusch-Pagan test
##
## data: modelo
## BP = 137.2, df = 8, p-value < 2.2e-16
##
## Breusch-Pagan test
##
## data: modelo
## BP = 140.27, df = 8, p-value < 2.2e-16
## [1] 15.50731
El estadístico teórico es \(\chi^2_{0.05;\,8} =\) 15.5073. La prueba studentizada da \(LM =\) 137.1963 (p-valor < 1e-04) y la original da \(LM =\) 140.2684 (p-valor < 1e-04). En ambas versiones el estadístico de prueba supera al estadístico teórico y el p-valor es menor que 0.05, por lo que se rechaza H0.
Hay evidencia de que la varianza de los errores no es constante: la dispersión de los errores de predicción cambia según las características de la mezcla, de modo que el modelo no predice con la misma precisión para todas las resistencias. En consecuencia, los errores estándar de MCO no son confiables y las pruebas t y F pueden conducir a conclusiones engañosas. Se recomienda transformar la variable respuesta o las regresoras para estabilizar la varianza, usar errores estándar robustos a heterocedasticidad (HC3) para la inferencia y revisar si la forma funcional del modelo está bien especificada, porque una relación no lineal mal modelada también produce este patrón. En el apartado 7 se aplican la transformación de la edad y los errores estándar HC3.
El modelo supone que los errores no están correlacionados entre sí. Este supuesto suele revisarse cuando las observaciones tienen un orden natural, por ejemplo en el tiempo. En esta base, el orden de las filas corresponde a cómo está organizado el conjunto de mezclas y no a una secuencia temporal, por lo que el resultado debe leerse con cautela. La verificación se hace con un gráfico de los residuales según el orden de las observaciones y con la prueba de Durbin-Watson (Durbin y Watson, 1950).
orden <- 1:n
plot(orden, residuales, pch = 20, main = "Residuales según el orden de las observaciones",
xlab = "Orden de las observaciones", ylab = "Residuales")
abline(h = 0, col = "red")Si los errores son independientes, los residuales no muestran patrón alguno: ni rachas largas del mismo signo ni tendencias.
Hipótesis.
\[H_0: \rho = 0 \qquad \text{vs.} \qquad H_1: \rho \neq 0\]
donde \(\rho\) es la autocorrelación de primer orden de los errores, \(\varepsilon_t = \rho\,\varepsilon_{t-1} + u_t\), con \(\alpha = 0.05\).
Estadístico.
\[d = \frac{\sum_{t=2}^{n}(e_t - e_{t-1})^2}{\sum_{t=1}^{n} e_t^2} \approx 2\,(1 - \hat{\rho})\]
Un valor de \(d\) cercano a 2 indica ausencia de autocorrelación. Las tablas de Durbin-Watson no cubren \(n = 1030\), así que el estadístico teórico se obtiene con la aproximación normal: \(d\) tiene media 2 y varianza aproximada \(4/n\), por lo que se rechaza \(H_0\) si \(d\) queda fuera del intervalo
\[2 \pm z_{\alpha/2}\,\frac{2}{\sqrt{n}}\]
Código y resultados.
## lag Autocorrelation D-W Statistic p-value
## 1 0.3559936 1.281638 0
## Alternative hypothesis: rho != 0
# Las tablas de Durbin-Watson no cubren n = 1030, por eso se usa el p-valor
# La base esta ordenada por mezclas (no por tiempo): interpretar con cautelaEl estadístico y los límites de no rechazo se calculan así:
d <- sum(diff(residuales)^2) / sum(residuales^2)
r1 <- sum(residuales[-1] * residuales[-n]) / sum(residuales^2)
z_crit <- qnorm(0.975)
d_inf <- 2 - z_crit * 2 / sqrt(n)
d_sup <- 2 + z_crit * 2 / sqrt(n)
data.frame(d = d, r1 = r1, limite_inferior = d_inf, limite_superior = d_sup)## d r1 limite_inferior limite_superior
## 1 1.281638 0.3559936 1.87786 2.12214
El estadístico de prueba es \(d =\)
1.2816, con una autocorrelación estimada de 0.356, y la región de no
rechazo es el intervalo (1.8779; 2.1221). Como d cae fuera del
intervalo, se rechaza H0. El p-valor de durbinWatsonTest es
< 1e-04.
Hay evidencia de autocorrelación entre los residuales. Sin embargo, como las filas no están ordenadas en el tiempo, este resultado puede reflejar que la base está agrupada por tipos de mezcla, con mezclas parecidas una junto a otra, y no una dependencia temporal real. En conclusión, el supuesto de independencia no se cumple según la prueba de Durbin-Watson. Si el orden de los ensayos tuviera un significado real, como la fecha o el lote de producción, se recomienda repetir la prueba con ese orden y, de confirmarse la dependencia, ajustar el modelo teniéndola en cuenta. Si no lo tiene, se recomienda interpretar la prueba con cautela y usar errores estándar robustos, como se hace en el apartado 7.
Hay multicolinealidad cuando algunas regresoras están fuertemente
relacionadas entre sí. En ese caso los coeficientes se vuelven
inestables, sus errores estándar aumentan y resulta difícil separar el
efecto de cada variable. En una mezcla de concreto es un problema
posible, porque los componentes comparten el mismo volumen y se ajustan
unos en función de otros. Para diagnosticarla se calcula el factor de
inflación de la varianza (VIF) de cada regresora, con la función
vif del paquete car (Fox y Weisberg,
2019).
\[VIF_j = \frac{1}{1 - R_j^2}\]
donde \(R_j^2\) es el coeficiente de determinación de la regresión de \(x_j\) sobre las demás regresoras. Como criterio, un \(VIF < 5\) indica que no hay problema, un \(VIF\) entre 5 y 10 indica multicolinealidad moderada y un \(VIF > 10\) indica multicolinealidad severa.
## cement slag flyash water
## 7.488944 7.276963 6.170634 7.003957
## superplasticizer coarseaggregate fineaggregate age
## 2.963776 5.074617 7.005081 1.118367
El mayor VIF es el de cement (7.489). Ninguna variable supera el valor de 10, pero 6 variables tienen un VIF de 5 o más (cement, slag, flyash, water, coarseaggregate, fineaggregate), lo que indica multicolinealidad moderada.
Algunos componentes de la mezcla están relacionados entre sí, de modo que sus coeficientes pueden ser inestables y es más difícil separar el efecto individual de cada ingrediente sobre la resistencia. Frente a esto se recomienda eliminar una de las variables muy correlacionadas o combinarlas, centrar las variables cuando hay términos relacionados entre sí y revisar la selección de variables del apartado 8, que puede reducir el problema.
Una observación influyente es una mezcla que, al retirarla, cambia de forma apreciable los coeficientes estimados. La distancia de Cook (Cook, 1977) mide esa influencia, y suele señalarse como influyente toda observación con \(D_i > 4/n\).
\[D_i = \frac{r_i^2}{k + 1}\cdot\frac{h_{ii}}{1 - h_{ii}}\]
cook <- cooks.distance(modelo)
plot(cook, type = "h", main = "Distancia de Cook",
ylab = "Distancia de Cook", xlab = "Observación")
abline(h = 4/n, col = "red")## [1] 79
## [1] 2
Hay 79 observaciones con distancia de Cook mayor que \(4/n =\) 0.00388 y 2 con residual estandarizado de valor absoluto mayor que 3.
La edad influye sobre la resistencia de forma no lineal: el concreto
gana resistencia con rapidez en los primeros días y después más
despacio. Por eso se prueba un modelo con el logaritmo de la edad y su
cuadrado. En modelo2 el término cuadrático se calcula sin
centrar. En modelo3 el logaritmo de la edad se centra en su
media antes de elevarlo al cuadrado, lo que reduce la multicolinealidad
entre ambos términos.
\[logage_c = \ln(age) - \overline{\ln(age)}, \qquad logage\_c2 = logage_c^{\,2}\]
logage <- log(age)
logage_c <- logage - mean(logage)
logage_c2 <- logage_c^2
modelo2 <- lm(csMPa ~ cement + slag + flyash + water + superplasticizer +
coarseaggregate + fineaggregate + logage + I(logage^2))
modelo3 <- lm(csMPa ~ cement + slag + flyash + water + superplasticizer +
coarseaggregate + fineaggregate + logage_c + logage_c2)
vif(modelo2)## cement slag flyash water
## 7.582262 7.281209 6.141904 7.042623
## superplasticizer coarseaggregate fineaggregate logage
## 2.984403 5.112441 7.053790 18.895152
## I(logage^2)
## 19.092992
## cement slag flyash water
## 7.582262 7.281209 6.141904 7.042623
## superplasticizer coarseaggregate fineaggregate logage_c
## 2.984403 5.112441 7.053790 1.072679
## logage_c2
## 1.108075
Los supuestos de los apartados 4, 5 y 6 se verifican de nuevo sobre
modelo3 con la función supuestos.
# Funcion que repite los supuestos para un modelo
supuestos <- function(m, nombre) {
r <- m$residuals
qqnorm(r, main = paste("Gráfico Q-Q", nombre)); qqline(r, col = "red")
plot(m$fitted.values, r, pch = 20, xlab = "Valores ajustados",
ylab = "Residuales", main = paste("Residuales vs. valores ajustados -", nombre))
abline(h = 0, col = "red")
print(lillie.test(r)); print(ad.test(r)); print(shapiro.test(r))
print(bptest(m)); print(bptest(m, studentize = F))
print(durbinWatsonTest(m, alternative = "two.sided"))
}
res2 <- modelo3$residuals
hist(res2, breaks = 30, col = "green", main = "Residuales del modelo mejorado")##
## Lilliefors (Kolmogorov-Smirnov) normality test
##
## data: r
## D = 0.038886, p-value = 0.0008948
##
##
## Anderson-Darling normality test
##
## data: r
## A = 2.128, p-value = 2.082e-05
##
##
## Shapiro-Wilk normality test
##
## data: r
## W = 0.99254, p-value = 4.682e-05
##
##
## studentized Breusch-Pagan test
##
## data: m
## BP = 86.64, df = 9, p-value = 7.671e-15
##
##
## Breusch-Pagan test
##
## data: m
## BP = 101.39, df = 9, p-value < 2.2e-16
##
## lag Autocorrelation D-W Statistic p-value
## 1 0.3540996 1.284039 0
## Alternative hypothesis: rho != 0
Para la inferencia cuando algún supuesto no se cumple, se calculan
los errores estándar robustos HC3, con los paquetes lmtest
y sandwich (Zeileis, 2004; Zeileis y Hothorn, 2002), y se
comparan los tres modelos con AIC y BIC.
##
## t test of coefficients:
##
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -55.6890571 22.2674858 -2.5009 0.0125432 *
## cement 0.1372653 0.0068356 20.0810 < 2.2e-16 ***
## slag 0.1165318 0.0086018 13.5474 < 2.2e-16 ***
## flyash 0.0938971 0.0094738 9.9112 < 2.2e-16 ***
## water -0.1160249 0.0342693 -3.3857 0.0007371 ***
## superplasticizer 0.1067381 0.0752897 1.4177 0.1565841
## coarseaggregate 0.0319016 0.0078138 4.0827 4.799e-05 ***
## fineaggregate 0.0381406 0.0087169 4.3755 1.336e-05 ***
## logage_c 8.6115779 0.1966768 43.7854 < 2.2e-16 ***
## logage_c2 -0.6524412 0.1420640 -4.5926 4.924e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## df AIC
## modelo 10 7757.924
## modelo2 11 6960.565
## modelo3 11 6960.565
## df BIC
## modelo 10 7807.297
## modelo2 11 7014.875
## modelo3 11 7014.875
Con el logaritmo de la edad centrado, el mayor VIF del modelo es
7.58, frente a 7.49 en el modelo original. Los p-valores de las pruebas
de normalidad (Lilliefors, Anderson-Darling y Shapiro-Wilk) son
0.0008948, < 1e-04 y < 1e-04; los de Breusch-Pagan (studentizado y
original) son < 1e-04 y < 1e-04, y el de Durbin-Watson es <
1e-04. El AIC pasa de 7757.9 en el modelo original a 6960.6 en
modelo3, y el BIC pasa de 7807.3 a 7014.9; el modelo
mejorado ajusta mejor según ambos criterios. Para los supuestos que
sigan sin cumplirse, la tabla con errores estándar HC3 permite hacer la
inferencia sobre los coeficientes sin depender de la varianza
constante.
En conclusión, la transformación logarítmica de la edad con centrado
es la recomendación que se aplica frente a los supuestos y a la
multicolinealidad, y modelo3 es la base para la selección
de variables del apartado 8.
Seleccionar un modelo consiste en encontrar el subconjunto de
variables que explique bien la resistencia sin incluir variables que
aporten poco. Para ello se calculan cinco criterios sobre todos los
subconjuntos posibles de las nueve variables del modelo mejorado
(logage_c, logage_c2 y las siete variables de
la mezcla), que son \(2^9 - 1 = 511\)
modelos sin contar el que solo tiene el intercepto. Se mantiene la
jerarquía: un modelo con logage_c2 solo se considera si
también incluye logage_c. Después se aplican los algoritmos
Forward Selection, Backward Elimination y Stepwise.
Para un modelo con \(p\) parámetros (incluido el intercepto), donde \(\hat{\sigma}^2\) es el cuadrado medio residual del modelo completo y \(h_{ii}\) es el apalancamiento de la observación \(i\):
\[R^2_{aj} = 1 - \frac{SSE_p/(n - p)}{SST/(n - 1)}, \qquad C_p = \frac{SSE_p}{\hat{\sigma}^2} - (n - 2p)\]
\[AIC = -2\ln(L) + 2\,m, \qquad BIC = -2\ln(L) + m\,\ln(n), \qquad PRESS = \sum_{i=1}^{n}\left(\frac{e_i}{1 - h_{ii}}\right)^2\]
donde \(m\) es el número de
parámetros que estima lm (los coeficientes y la varianza).
Un mejor modelo tiene mayor \(R^2_{aj}\), menor AIC, BIC y PRESS, y un
\(C_p\) pequeño y cercano a \(p\). El BIC penaliza la complejidad más que
el AIC. El AIC corresponde a Akaike (1974) y el PRESS a Allen
(1974).
datos2 <- data.frame(csMPa, logage_c, logage_c2, cement, slag, flyash, water,
superplasticizer, coarseaggregate, fineaggregate)
vars <- names(datos2)[-1]
full <- lm(csMPa ~ ., data = datos2)
sigma2 <- summary(full)$sigma^2
press <- function(m) sum((residuals(m) / (1 - hatvalues(m)))^2)
tabla <- NULL
for (r in 1:length(vars)) {
for (cmb in combn(vars, r, simplify = FALSE)) {
m <- lm(reformulate(cmb, "csMPa"), data = datos2)
p <- length(coef(m))
tabla <- rbind(tabla, data.frame(
variables = paste(cmb, collapse = " + "), p = p,
R2aj = summary(m)$adj.r.squared,
Cp = sum(residuals(m)^2) / sigma2 - (n - 2 * p),
AIC = AIC(m), BIC = BIC(m), PRESS = press(m)))
}
}
nrow(tabla) # 511 modelos## [1] 511
# Jerarquia: si esta logage_c2 debe estar logage_c
tabla <- tabla[vapply(strsplit(tabla$variables, " + ", fixed = TRUE),
function(x) !("logage_c2" %in% x) || ("logage_c" %in% x),
logical(1)), ]
tabla <- tabla[order(tabla$BIC), ]Los diez mejores modelos según el BIC y el mejor modelo según cada criterio son los siguientes.
knitr::kable(head(tabla, 10), digits = 3, row.names = FALSE,
caption = "Tabla 4. Los diez mejores modelos según el BIC")| variables | p | R2aj | Cp | AIC | BIC | PRESS |
|---|---|---|---|---|---|---|
| logage_c + logage_c2 + cement + slag + flyash + water + coarseaggregate + fineaggregate | 9 | 0.821 | 10.814 | 6961.402 | 7010.776 | 51999.81 |
| logage_c + logage_c2 + cement + slag + flyash + water + superplasticizer + coarseaggregate + fineaggregate | 10 | 0.821 | 10.000 | 6960.565 | 7014.875 | 51995.36 |
| logage_c + logage_c2 + cement + slag + flyash + water | 7 | 0.817 | 32.935 | 6983.377 | 7022.876 | 53069.18 |
| logage_c + logage_c2 + cement + slag + flyash + water + fineaggregate | 8 | 0.818 | 30.860 | 6981.368 | 7025.804 | 52967.39 |
| logage_c + logage_c2 + cement + slag + flyash + superplasticizer + coarseaggregate + fineaggregate | 9 | 0.819 | 26.004 | 6976.587 | 7025.960 | 52760.88 |
| logage_c + logage_c2 + cement + slag + flyash + water + coarseaggregate | 8 | 0.817 | 34.198 | 6984.653 | 7029.088 | 53138.02 |
| logage_c + logage_c2 + cement + slag + flyash + water + superplasticizer | 8 | 0.817 | 34.699 | 6985.145 | 7029.581 | 53213.83 |
| logage_c + cement + slag + flyash + water + coarseaggregate + fineaggregate | 8 | 0.817 | 35.725 | 6986.152 | 7030.588 | 53255.94 |
| logage_c + logage_c2 + cement + slag + flyash + water + superplasticizer + fineaggregate | 9 | 0.817 | 32.859 | 6983.366 | 7032.739 | 53118.67 |
| logage_c + cement + slag + flyash + water + superplasticizer + coarseaggregate + fineaggregate | 9 | 0.817 | 34.233 | 6984.720 | 7034.093 | 53224.58 |
## variables
## 511 logage_c + logage_c2 + cement + slag + flyash + water + superplasticizer + coarseaggregate + fineaggregate
## p R2aj Cp AIC BIC PRESS
## 511 10 0.821498 10 6960.565 7014.875 51995.36
## variables
## 511 logage_c + logage_c2 + cement + slag + flyash + water + superplasticizer + coarseaggregate + fineaggregate
## p R2aj Cp AIC BIC PRESS
## 511 10 0.821498 10 6960.565 7014.875 51995.36
## variables
## 511 logage_c + logage_c2 + cement + slag + flyash + water + superplasticizer + coarseaggregate + fineaggregate
## p R2aj Cp AIC BIC PRESS
## 511 10 0.821498 10 6960.565 7014.875 51995.36
## variables
## 504 logage_c + logage_c2 + cement + slag + flyash + water + coarseaggregate + fineaggregate
## p R2aj Cp AIC BIC PRESS
## 504 9 0.8211808 10.81403 6961.402 7010.776 51999.81
## variables
## 511 logage_c + logage_c2 + cement + slag + flyash + water + superplasticizer + coarseaggregate + fineaggregate
## p R2aj Cp AIC BIC PRESS
## 511 10 0.821498 10 6960.565 7014.875 51995.36
En Forward Selection se parte del modelo sin variables y en cada paso entra la que más mejora el criterio. En Backward Elimination se parte del modelo completo y en cada paso sale la que menos aporta. Stepwise combina ambos movimientos. Forward y Backward usan el AIC; Stepwise usa el BIC.
nulo <- lm(csMPa ~ 1, data = datos2)
modelo_forward <- step(nulo, scope = formula(full), direction = "forward", k = 2, trace = 0)
modelo_backward <- step(full, direction = "backward", k = 2, trace = 0)
modelo_stepwise <- step(nulo, scope = formula(full), direction = "both", k = log(n), trace = 0)
modelos <- list(modelo_forward, modelo_backward, modelo_stepwise)
data.frame(Metodo = c("Forward AIC", "Backward AIC", "Stepwise BIC"),
R2_ajustado = sapply(modelos, function(m) summary(m)$adj.r.squared),
AIC = sapply(modelos, AIC),
BIC = sapply(modelos, BIC))## Metodo R2_ajustado AIC BIC
## 1 Forward AIC 0.8214980 6960.565 7014.875
## 2 Backward AIC 0.8214980 6960.565 7014.875
## 3 Stepwise BIC 0.8169725 6983.377 7022.876
Las variables que conserva cada método son:
## [1] "logage_c" "cement" "water" "slag"
## [5] "flyash" "logage_c2" "fineaggregate" "coarseaggregate"
## [9] "superplasticizer"
## [1] "logage_c" "logage_c2" "cement" "slag"
## [5] "flyash" "water" "superplasticizer" "coarseaggregate"
## [9] "fineaggregate"
## [1] "logage_c" "cement" "water" "slag" "flyash" "logage_c2"
Tras aplicar la jerarquía quedan 383 de los 511 modelos. Cada criterio elige el siguiente modelo:
Forward y Backward (con criterio AIC) conservan 9 y 9 variables, respectivamente, y Stepwise con criterio BIC conserva 6.
Como modelo final se toma el que resulta del método Stepwise con criterio BIC. Se revisan su resumen, el VIF, los supuestos y los errores estándar robustos HC3, y se evalúa su capacidad de predicción con validación cruzada de 10 particiones, comparándola con la del modelo original.
##
## Call:
## lm(formula = csMPa ~ logage_c + cement + water + slag + flyash +
## logage_c2, data = datos2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -22.1594 -4.6004 -0.1999 4.6005 28.8100
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 40.384164 2.529418 15.966 < 2e-16 ***
## logage_c 8.531173 0.191980 44.438 < 2e-16 ***
## cement 0.110951 0.002692 41.210 < 2e-16 ***
## water -0.244556 0.011340 -21.565 < 2e-16 ***
## slag 0.085111 0.003114 27.328 < 2e-16 ***
## flyash 0.059442 0.004640 12.811 < 2e-16 ***
## logage_c2 -0.612878 0.128412 -4.773 2.08e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 7.147 on 1023 degrees of freedom
## Multiple R-squared: 0.818, Adjusted R-squared: 0.817
## F-statistic: 766.5 on 6 and 1023 DF, p-value: < 2.2e-16
## logage_c cement water slag flyash logage_c2
## 1.053974 1.594790 1.181378 1.454517 1.776174 1.098162
##
## Lilliefors (Kolmogorov-Smirnov) normality test
##
## data: r
## D = 0.03625, p-value = 0.002832
##
##
## Anderson-Darling normality test
##
## data: r
## A = 1.0567, p-value = 0.008892
##
##
## Shapiro-Wilk normality test
##
## data: r
## W = 0.99617, p-value = 0.01217
##
##
## studentized Breusch-Pagan test
##
## data: m
## BP = 71.904, df = 6, p-value = 1.662e-13
##
##
## Breusch-Pagan test
##
## data: m
## BP = 81.439, df = 6, p-value = 1.801e-15
##
## lag Autocorrelation D-W Statistic p-value
## 1 0.3555746 1.282598 0
## Alternative hypothesis: rho != 0
##
## t test of coefficients:
##
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 40.3841638 2.9595418 13.6454 < 2.2e-16 ***
## logage_c 8.5311728 0.1998716 42.6833 < 2.2e-16 ***
## cement 0.1109513 0.0025716 43.1449 < 2.2e-16 ***
## water -0.2445560 0.0140400 -17.4185 < 2.2e-16 ***
## slag 0.0851107 0.0033594 25.3347 < 2.2e-16 ***
## flyash 0.0594421 0.0043769 13.5808 < 2.2e-16 ***
## logage_c2 -0.6128781 0.1406411 -4.3577 1.447e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
set.seed(123)
folds <- sample(rep(1:10, length.out = n))
cv_rmse <- function(fm, d) {
mean(sapply(1:10, function(i) {
m <- lm(fm, data = d[folds != i, ])
sqrt(mean((d$csMPa[folds == i] - predict(m, d[folds == i, ]))^2))
}))
}
RMSE_final <- cv_rmse(formula(modelo_final), datos2)
RMSE_original <- cv_rmse(csMPa ~ cement + slag + flyash + water + superplasticizer +
coarseaggregate + fineaggregate + age, Concreto)
data.frame(Modelo = c("Modelo original", "Modelo final"),
RMSE = c(RMSE_original, RMSE_final))## Modelo RMSE
## 1 Modelo original 10.496535
## 2 Modelo final 7.171034
El BIC penaliza más las variables adicionales que el AIC, por lo que tiende a elegir modelos más pequeños. El modelo que elige el BIC tiene 8 variables regresoras y el que elige el \(R^2_{aj}\) tiene 9. Las variables adicionales del modelo del R² ajustado aportan poco a la explicación de la resistencia, de modo que el modelo más pequeño conserva casi la misma capacidad explicativa con menos componentes.
El modelo final contiene las variables logage_c, cement, water, slag, flyash, logage_c2, con un \(R^2\) ajustado de 0.817 y un VIF máximo de 1.78. En la validación cruzada, el error de predicción (RMSE) baja de 10.5 MPa en el modelo original a 7.17 MPa en el modelo final. Por lo tanto, el modelo final es mejor para predecir la resistencia del concreto que el modelo con las ocho variables originales.
Akaike, H. (1974). A new look at the statistical model identification. IEEE Transactions on Automatic Control, 19(6), 716-723.
Allen, D. M. (1974). The relationship between variable selection and data augmentation and a method for prediction. Technometrics, 16(1), 125-127.
Anderson, T. W., & Darling, D. A. (1952). Asymptotic theory of certain “goodness of fit” criteria based on stochastic processes. The Annals of Mathematical Statistics, 23(2), 193-212.
Breusch, T. S., & Pagan, A. R. (1979). A simple test for heteroscedasticity and random coefficient variation. Econometrica, 47(5), 1287-1294.
Cook, R. D. (1977). Detection of influential observation in linear regression. Technometrics, 19(1), 15-18.
Durbin, J., & Watson, G. S. (1950). Testing for serial correlation in least squares regression I. Biometrika, 37(3-4), 409-428.
Fox, J., & Weisberg, S. (2019). An R companion to applied regression (3.ª ed.). Sage.
Gross, J., & Ligges, U. (2015). nortest: Tests for normality. R package. https://CRAN.R-project.org/package=nortest
Kaggle. (s. f.). Concrete compressive strength [Conjunto de datos]. https://www.kaggle.com/
Koenker, R. (1981). A note on studentizing a test for heteroscedasticity. Journal of Econometrics, 17(1), 107-112.
Lilliefors, H. W. (1967). On the Kolmogorov-Smirnov test for normality with mean and variance unknown. Journal of the American Statistical Association, 62(318), 399-402.
Shapiro, S. S., & Wilk, M. B. (1965). An analysis of variance test for normality (complete samples). Biometrika, 52(3-4), 591-611.
Yeh, I.-C. (1998). Modeling of strength of high-performance concrete using artificial neural networks. Cement and Concrete Research, 28(12), 1797-1808.
Zeileis, A. (2004). Econometric computing with HC and HAC covariance matrix estimators. Journal of Statistical Software, 11(10), 1-17.
Zeileis, A., & Hothorn, T. (2002). Diagnostic checking in regression relationships. R News, 2(3), 7-10.