Este modelo evalúa una relación de crecimiento exponencial entre el índice de humedad del suelo y la precipitación acumulada en 30 días.
library(readxl)
library(ggplot2)
library(knitr)
datos <- read_excel("dataset_landslides.xlsx", sheet = "Dataset_landslides")
datos <- as.data.frame(datos)
options(scipen = 999)
resumen_dataset <- data.frame(
Elemento = c(
"Archivo utilizado",
"Hoja utilizada",
"Número de filas",
"Número de columnas",
"Variable independiente X",
"Variable dependiente Y"
),
Descripcion = c(
"dataset_landslides.xlsx",
"Dataset_landslides",
nrow(datos),
ncol(datos),
"Índice de humedad del suelo",
"Precipitación acumulada en 30 días"
)
)
knitr::kable(
resumen_dataset,
caption = "Resumen inicial del dataset"
)
| Elemento | Descripcion |
|---|---|
| Archivo utilizado | dataset_landslides.xlsx |
| Hoja utilizada | Dataset_landslides |
| Número de filas | 11033 |
| Número de columnas | 25 |
| Variable independiente X | Índice de humedad del suelo |
| Variable dependiente Y | Precipitación acumulada en 30 días |
limpiar_numerico <- function(variable) {
variable <- as.character(variable)
variable <- gsub(",", ".", variable)
as.numeric(variable)
}
datos_regresion <- data.frame(
soil_moisture_index = limpiar_numerico(datos$soil_moisture_index),
precipitation_30d_mm = limpiar_numerico(datos$precipitation_30d_mm)
)
datos_regresion <- datos_regresion[
is.finite(datos_regresion$soil_moisture_index) &
is.finite(datos_regresion$precipitation_30d_mm) &
datos_regresion$precipitation_30d_mm > 0,
]
x <- datos_regresion$soil_moisture_index
y <- datos_regresion$precipitation_30d_mm
tabla_variables <- data.frame(
Variable = c("X", "Y"),
Nombre_en_dataset = c(
"soil_moisture_index",
"precipitation_30d_mm"
),
Descripcion = c(
"Índice de humedad del suelo",
"Precipitación acumulada en 30 días"
),
Unidad = c("Índice", "mm")
)
knitr::kable(
tabla_variables,
caption = "Variables seleccionadas para el modelo exponencial"
)
| Variable | Nombre_en_dataset | Descripcion | Unidad |
|---|---|---|---|
| X | soil_moisture_index | Índice de humedad del suelo | Índice |
| Y | precipitation_30d_mm | Precipitación acumulada en 30 días | mm |
tabla_pares <- data.frame(
Indice_humedad_suelo = x,
Precipitacion_30_dias_mm = y
)
knitr::kable(
head(tabla_pares, 10),
digits = 4,
caption = "Primeros diez pares de valores utilizados en el modelo exponencial"
)
| Indice_humedad_suelo | Precipitacion_30_dias_mm |
|---|---|
| 0.6991 | 228.20 |
| 0.9316 | 326.56 |
| 0.8163 | 207.24 |
| 0.8226 | 229.48 |
| 0.5915 | 64.64 |
| 0.9407 | 396.80 |
| 0.9310 | 306.79 |
| 0.9337 | 315.85 |
| 0.8726 | 276.36 |
| 0.9837 | 484.71 |
resumen_variables <- data.frame(
Variable = c("Índice de humedad del suelo", "Precipitación acumulada 30 días"),
Minimo = c(min(x), min(y)),
Media = c(mean(x), mean(y)),
Mediana = c(median(x), median(y)),
Maximo = c(max(x), max(y))
)
knitr::kable(
resumen_variables,
digits = 2,
caption = "Resumen estadístico de las variables"
)
| Variable | Minimo | Media | Mediana | Maximo |
|---|---|---|---|---|
| Índice de humedad del suelo | 0.10 | 0.73 | 0.77 | 1 |
| Precipitación acumulada 30 días | 7.62 | 289.44 | 242.06 | 1500 |
ggplot(
datos_regresion,
aes(
x = soil_moisture_index,
y = precipitation_30d_mm
)
) +
geom_point(
color = "blue",
alpha = 0.28,
size = 1.7
) +
labs(
title = "REGRESIÓN EXPONENCIAL",
subtitle = "Nube de puntos entre humedad del suelo y precipitación acumulada en 30 días",
x = "Índice de humedad del suelo",
y = "Precipitación acumulada en 30 días (mm)"
) +
theme_bw(base_size = 15) +
theme(
plot.title = element_text(
hjust = 0.5,
face = "bold",
size = 26,
color = "#0B3C5D"
),
plot.subtitle = element_text(
hjust = 0.5,
size = 13,
color = "#444444"
),
axis.title = element_text(
face = "bold",
size = 13
),
axis.text = element_text(
size = 11
),
panel.border = element_rect(
color = "gray35",
fill = NA,
linewidth = 1
),
panel.grid.major = element_line(
color = "gray88"
),
panel.grid.minor = element_blank(),
plot.background = element_rect(
fill = "white",
color = NA
),
panel.background = element_rect(
fill = "white",
color = NA
)
)
A medida que aumenta el índice de humedad del suelo, la precipitación acumulada en 30 días presenta un crecimiento no lineal, por lo que se propone un modelo de tipo exponencial.
La estructura matemática del modelo exponencial es:
\[ \hat{y} = ae^{bx} \]
Donde:
q_inf <- as.numeric(quantile(x, 0.10))
q_sup <- as.numeric(quantile(x, 0.90))
y_inf <- median(y[x <= q_inf])
y_sup <- median(y[x >= q_sup])
b_inicio <- log(y_sup / y_inf) / (q_sup - q_inf)
a_inicio <- y_inf / exp(b_inicio * q_inf)
modelo_exponencial <- nls(
precipitation_30d_mm ~ a * exp(b * soil_moisture_index),
data = datos_regresion,
start = list(
a = a_inicio,
b = b_inicio
),
control = nls.control(
maxiter = 500,
warnOnly = TRUE
)
)
parametros <- coef(modelo_exponencial)
a_exponencial <- as.numeric(parametros["a"])
b_exponencial <- as.numeric(parametros["b"])
y_estimado <- predict(modelo_exponencial)
sse <- sum((y - y_estimado)^2)
sst <- sum((y - mean(y))^2)
r_cuadrado <- 1 - (sse / sst)
rmse <- sqrt(mean((y - y_estimado)^2))
tabla_modelo <- data.frame(
Parametro = c("a", "b", "R²", "RMSE"),
Valor = c(a_exponencial, b_exponencial, r_cuadrado, rmse),
Interpretacion = c(
"Valor inicial del modelo exponencial",
"Tasa de crecimiento exponencial",
"Proporción de variabilidad explicada por el modelo en la escala original",
"Error promedio aproximado del modelo"
)
)
knitr::kable(
tabla_modelo,
digits = 4,
caption = "Parámetros principales del modelo exponencial"
)
| Parametro | Valor | Interpretacion |
|---|---|---|
| a | 11.7921 | Valor inicial del modelo exponencial |
| b | 3.9334 | Tasa de crecimiento exponencial |
| R² | 0.7697 | Proporción de variabilidad explicada por el modelo en la escala original |
| RMSE | 93.2311 | Error promedio aproximado del modelo |
Ecuación exponencial
Y = a * e(b * x)
Y = 11.79 * e(3.9334 * x)
R² = 0.7697
El modelo explica aproximadamente 76.97% de la variabilidad observada en la precipitación acumulada.
RMSE = 93.23 mm
tabla_coeficientes <- data.frame(
Parametro = c("a", "b"),
Valor = c(a_exponencial, b_exponencial),
Significado = c(
"Coeficiente inicial de la curva exponencial",
"Tasa de crecimiento de la curva exponencial"
)
)
knitr::kable(
tabla_coeficientes,
digits = 4,
caption = "Coeficientes del modelo exponencial directo"
)
| Parametro | Valor | Significado |
|---|---|---|
| a | 11.7921 | Coeficiente inicial de la curva exponencial |
| b | 3.9334 | Tasa de crecimiento de la curva exponencial |
x_secuencia <- seq(
min(x),
max(x),
length.out = 300
)
curva_exponencial <- data.frame(
soil_moisture_index = x_secuencia,
precipitacion_estimada = a_exponencial * exp(b_exponencial * x_secuencia)
)
ecuacion_texto <- paste0(
"y = ",
round(a_exponencial, 4),
"e^(",
round(b_exponencial, 4),
"x) | R² = ",
round(r_cuadrado, 3)
)
ggplot() +
geom_point(
data = datos_regresion,
aes(
x = soil_moisture_index,
y = precipitation_30d_mm
),
color = "blue",
alpha = 0.28,
size = 1.7
) +
geom_line(
data = curva_exponencial,
aes(
x = soil_moisture_index,
y = precipitacion_estimada
),
color = "red",
linewidth = 1.5
) +
labs(
title = "REGRESIÓN EXPONENCIAL",
subtitle = ecuacion_texto,
x = "Índice de humedad del suelo",
y = "Precipitación acumulada en 30 días (mm)"
) +
theme_bw(base_size = 15) +
theme(
plot.title = element_text(
hjust = 0.5,
face = "bold",
size = 26,
color = "#0B3C5D"
),
plot.subtitle = element_text(
hjust = 0.5,
face = "bold",
size = 13,
color = "#222222"
),
axis.title = element_text(
face = "bold",
size = 13
),
axis.text = element_text(
size = 11
),
panel.border = element_rect(
color = "gray35",
fill = NA,
linewidth = 1
),
panel.grid.major = element_line(
color = "gray88"
),
panel.grid.minor = element_blank(),
plot.background = element_rect(
fill = "white",
color = NA
),
panel.background = element_rect(
fill = "white",
color = NA
)
)
pearson_modelo <- cor.test(
y,
y_estimado,
method = "pearson"
)
r_pearson <- as.numeric(pearson_modelo$estimate)
p_valor <- pearson_modelo$p.value
tabla_evaluacion <- data.frame(
Indicador = c(
"Coeficiente de Pearson",
"p-value",
"R²",
"RMSE"
),
Valor = c(
round(r_pearson, 4),
format.pval(p_valor, digits = 4),
round(r_cuadrado, 4),
round(rmse, 2)
),
Interpretacion = c(
"Relación entre los valores observados y los valores estimados por la curva exponencial",
"Significancia estadística de la relación observada-estimada",
"Variabilidad explicada por el modelo en la escala original",
"Error promedio aproximado del modelo en milímetros"
)
)
knitr::kable(
tabla_evaluacion,
caption = "Evaluación del modelo exponencial"
)
| Indicador | Valor | Interpretacion |
|---|---|---|
| Coeficiente de Pearson | 0.8811 | Relación entre los valores observados y los valores estimados por la curva exponencial |
| p-value | < 0.00000000000000022 | Significancia estadística de la relación observada-estimada |
| R² | 0.7697 | Variabilidad explicada por el modelo en la escala original |
| RMSE | 93.23 | Error promedio aproximado del modelo en milímetros |
Coeficiente de Pearson observado-estimado: r = 0.8811
p-value: < 0.00000000000000022
Con un nivel de significancia de 0.05, la relación entre los valores observados y los valores estimados por el modelo es estadísticamente significativa.
Sí existe restricción matemática y estadística, ya que el modelo
exponencial fue construido con valores observados del índice de humedad
del suelo entre x = 0.1 y x =
1.
Además, la variable dependiente debe ser positiva,
porque el modelo exponencial estima valores de crecimiento mayores que
cero. En este caso, la precipitación acumulada mínima observada fue
7.62 mm.
Al introducir valores fuera del rango
observado, el modelo puede generar predicciones poco consistentes,
debido a que estaría realizando una extrapolación fuera de los datos
analizados.
valor_propuesto <- median(x)
if (
valor_propuesto < min_humedad ||
valor_propuesto > max_humedad
) {
valor_estimado <- median(x)
observacion_estimacion <- paste(
"El valor propuesto está fuera del rango observado.",
"Se usó la mediana del índice de humedad del suelo para la demostración."
)
} else {
valor_estimado <- valor_propuesto
observacion_estimacion <- "El valor propuesto está dentro del rango observado."
}
nuevo_evento <- data.frame(
soil_moisture_index = valor_estimado
)
precipitacion_estimada <- predict(
modelo_exponencial,
newdata = nuevo_evento
)
limite_inferior <- max(0, precipitacion_estimada - 1.96 * rmse)
limite_superior <- precipitacion_estimada + 1.96 * rmse
tabla_estimacion <- data.frame(
Indice_humedad_suelo = valor_estimado,
Precipitacion_estimada_30d_mm = precipitacion_estimada,
Limite_inferior_aproximado = limite_inferior,
Limite_superior_aproximado = limite_superior
)
knitr::kable(
tabla_estimacion,
digits = 2,
caption = "Pronóstico generado por el modelo exponencial"
)
| Indice_humedad_suelo | Precipitacion_estimada_30d_mm | Limite_inferior_aproximado | Limite_superior_aproximado |
|---|---|---|---|
| 0.77 | 246.36 | 63.63 | 429.09 |
Para un índice de humedad del suelo de:
0.77
La precipitación acumulada estimada en 30 días es:
246.36 mm
Rango aproximado:
63.63 mm a 429.09 mm
El modelo permitió evaluar la relación entre el índice de humedad del suelo y la precipitación acumulada en 30 días mediante una función exponencial directa.
El parámetro b = 3.9334, por lo que la relación estimada es positiva creciente.
El coeficiente de Pearson entre los valores observados y los valores estimados fue r = 0.881, con un p-value = < 0.00000000000000022. La relación observada-estimada resultó estadísticamente significativa.
El modelo explica aproximadamente 76.97% de la variabilidad de la precipitación acumulada en 30 días.
Su uso debe limitarse al rango observado del índice de humedad del suelo y entenderse como una asociación estadística, no como una causalidad absoluta.
La regresión exponencial fue desarrollada usando como variable independiente el índice de humedad del suelo y como variable dependiente la precipitación acumulada en 30 días. La representación visual principal corresponde a la curva exponencial ajustada sobre la nube de puntos en la escala original de los datos.