knitr::opts_chunk$set(echo = TRUE, message = FALSE, warning = FALSE, fig.align = "center")
Analizaremos la relación entre dosis de N (kg/ha) y diámetro de tallo (mm) en maíz. Ajustaremos modelos lineal y cuadrático, compararemos métricas y realizaremos una predicción.
library(tidyverse) # readr, dplyr, ggplot2
Cargar la base (CSV) y ver si es lo que teniamos que cargar.
MAIZ_FERTILIZANTE <- readr::read_csv("MAIZ_FERTILIZANTE.csv")
glimpse(MAIZ_FERTILIZANTE)
## Rows: 50
## Columns: 2
## $ DOSIS_N <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 50, 50, 50, 50, 50, 5…
## $ DIAMETRO_TALLO <dbl> 8.371554, 11.496018, 10.424468, 7.740558, 9.132100, 12.…
Hacemos este paso para que sea mas sencillo detectar incosistencias en los graficos y análisis posteriores.
summary(MAIZ_FERTILIZANTE)
## DOSIS_N DIAMETRO_TALLO
## Min. : 0 Min. : 6.36
## 1st Qu.: 50 1st Qu.:14.34
## Median :100 Median :16.92
## Mean :100 Mean :16.02
## 3rd Qu.:150 3rd Qu.:18.71
## Max. :200 Max. :21.59
MAIZ_FERTILIZANTE %>%
group_by(DOSIS_N) %>%
summarise(
n = n(),
media_diam = mean(DIAMETRO_TALLO, na.rm = TRUE),
sd_diam = sd(DIAMETRO_TALLO, na.rm = TRUE),
min_diam = min(DIAMETRO_TALLO, na.rm = TRUE),
max_diam = max(DIAMETRO_TALLO, na.rm = TRUE)
)
## # A tibble: 5 × 6
## DOSIS_N n media_diam sd_diam min_diam max_diam
## <dbl> <int> <dbl> <dbl> <dbl> <dbl>
## 1 0 10 9.60 1.95 6.36 12.5
## 2 50 10 15.7 1.72 14.0 18.3
## 3 100 10 17.9 1.62 15.9 20.2
## 4 150 10 18.3 1.70 14.8 20.4
## 5 200 10 18.6 1.90 15.4 21.6
ggplot(MAIZ_FERTILIZANTE, aes(x = DOSIS_N, y = DIAMETRO_TALLO)) +
geom_point(size = 2.8, alpha = 0.8) +
labs(x = "Dosis de N (kg/ha)", y = "Diámetro de tallo (mm)",
title = "Dispersión: DIÁMETRO_TALLO vs DOSIS_N") +
theme_minimal()
Solo viendo el grafico, queda cñlaro que la respuesta no es del todo lineal y se hace menos “proporcional” a mayores dosis de nitrógeno.
Modelos lineal y cuadrático
#Ajustar los modelos
MODELO_lineal <- lm(DIAMETRO_TALLO ~ DOSIS_N, data = MAIZ_FERTILIZANTE)
MODELO_cuad <- lm(DIAMETRO_TALLO ~ DOSIS_N + I(DOSIS_N^2), data = MAIZ_FERTILIZANTE)
#ver las estyadísticas de cada modelo
summary(MODELO_lineal)
##
## Call:
## lm(formula = DIAMETRO_TALLO ~ DOSIS_N, data = MAIZ_FERTILIZANTE)
##
## Residuals:
## Min 1Q Median 3Q Max
## -5.5481 -1.5960 0.2347 1.4300 4.3449
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 11.908075 0.598242 19.905 < 2e-16 ***
## DOSIS_N 0.041118 0.004885 8.418 5.18e-11 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2.442 on 48 degrees of freedom
## Multiple R-squared: 0.5962, Adjusted R-squared: 0.5878
## F-statistic: 70.86 on 1 and 48 DF, p-value: 5.182e-11
summary(MODELO_cuad)
##
## Call:
## lm(formula = DIAMETRO_TALLO ~ DOSIS_N + I(DOSIS_N^2), data = MAIZ_FERTILIZANTE)
##
## Residuals:
## Min 1Q Median 3Q Max
## -4.2288 -1.1872 -0.1897 1.3319 3.3898
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 9.9979513 0.5467262 18.287 < 2e-16 ***
## DOSIS_N 0.1175233 0.0129528 9.073 6.71e-12 ***
## I(DOSIS_N^2) -0.0003820 0.0000621 -6.151 1.59e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.837 on 47 degrees of freedom
## Multiple R-squared: 0.7763, Adjusted R-squared: 0.7668
## F-statistic: 81.54 on 2 and 47 DF, p-value: 5.224e-16
# Coeficientes
coef_lin <- coef(MODELO_lineal)
coef_cuad <- coef(MODELO_cuad)
# Ecuaciones como texto
ecuacion_lineal <- sprintf("DIAMETRO_TALLO = %.4f + %.4f * DOSIS_N",
coef_lin[1], coef_lin[2])
ecuacion_cuad <- sprintf("DIAMETRO_TALLO = %.4f + %.4f * DOSIS_N + %.6f * DOSIS_N^2",
coef_cuad[1], coef_cuad[2], coef_cuad[3])
# R² ajustado
r2_lin <- summary(MODELO_lineal)$adj.r.squared
r2_cuad <- summary(MODELO_cuad)$adj.r.squared
# AIC y BIC
aic_lin <- AIC(MODELO_lineal); bic_lin <- BIC(MODELO_lineal)
aic_cuad <- AIC(MODELO_cuad); bic_cuad <- BIC(MODELO_cuad)
# Tabla resumen
tibble::tibble(
Modelo = c("Lineal", "Cuadrático"),
Ecuacion = c(ecuacion_lineal, ecuacion_cuad),
R2_Ajustado = c(r2_lin, r2_cuad),
AIC = c(aic_lin, aic_cuad),
BIC = c(bic_lin, bic_cuad)
)
## # A tibble: 2 × 5
## Modelo Ecuacion R2_Ajustado AIC BIC
## <chr> <chr> <dbl> <dbl> <dbl>
## 1 Lineal DIAMETRO_TALLO = 11.9081 + 0.0411 * DOSIS_N 0.588 235. 241.
## 2 Cuadrático DIAMETRO_TALLO = 9.9980 + 0.1175 * DOSIS_N… 0.767 208. 215.
AIC (Akaike Information Criterion): mide qué tan bien el modelo explica los datos, penalizando la complejidad.
BIC (Bayesian Information Criterion): similar, pero penaliza más fuerte cuando el modelo tiene más parámetros (prefiere modelos más simples).
El cuadrático tiene AIC y BIC mucho menores que el lineal.
ΔAIC = 235.15 – 207.62 ≈ 27.5 → enorme, indica que el cuadrático es mucho más verosímil.
ΔBIC ≈ 25.6 → también muy fuerte a favor del cuadrático.
Un ΔAIC > 10 ya es evidencia muy fuerte de que un modelo es mejor.
El modelo cuadrático claramente ajusta mejor los datos.
# Comparación lado a lado con AIC/BIC y R² ajustado
AIC(MODELO_lineal, MODELO_cuad)
## df AIC
## MODELO_lineal 3 235.1473
## MODELO_cuad 4 207.6167
BIC(MODELO_lineal, MODELO_cuad)
## df BIC
## MODELO_lineal 3 240.8834
## MODELO_cuad 4 215.2648
data.frame(
Modelo = c("Lineal", "Cuadrático"),
R2_Ajustado = c(r2_lin, r2_cuad)
)
## Modelo R2_Ajustado
## 1 Lineal 0.5877542
## 2 Cuadrático 0.7667618
D. Gráficos de los Modelos y Predicción Dispersión + ajuste lineal y cuadrático superpuestos
ggplot(MAIZ_FERTILIZANTE, aes(x = DOSIS_N, y = DIAMETRO_TALLO)) +
geom_point(size = 2.8, alpha = 0.8) +
# Recta del modelo lineal
stat_smooth(method = "lm", color = "steelblue", size = 1.1,
formula = y ~ x) +
# Curva del modelo cuadrático
stat_smooth(method = "lm", color = "firebrick", size = 1.1,
formula = y ~ x + I(x^2)) +
labs(title = "Modelos ajustados: lineal (azul) y cuadrático (rojo)",
x = "Dosis de N (kg/ha)", y = "Diámetro de tallo (mm)") +
theme_minimal()
nuevo <- data.frame(DOSIS_N = 125)
pred_lin <- predict(MODELO_lineal, newdata = nuevo, interval = "confidence")
pred_cuad <- predict(MODELO_cuad, newdata = nuevo, interval = "confidence")
list(
Prediccion_Lineal = pred_lin,
Prediccion_Cuadratico = pred_cuad
)
## $Prediccion_Lineal
## fit lwr upr
## 1 17.04787 16.31128 17.78446
##
## $Prediccion_Cuadratico
## fit lwr upr
## 1 18.71922 17.94071 19.49773
A pésar de que el modelo Cuadrático es mucho mejor, la diferencia entre los valores predichos por ambos modelos no estan grande coimo cabría esperar, 17.05 tn/ha (16.31 a 17.78) en el modelo linealy 18.72 tn/ha (17.94 a 19.50), pero las predicciones del modelo cuadrático son mas confiables.-