Este modelo evalúa una relación logarítmica entre la precipitación acumulada en 7 días y el área afectada del deslizamiento.
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),
"Precipitación acumulada en 7 días",
"Área afectada del deslizamiento"
)
)
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 | Precipitación acumulada en 7 días |
| Variable dependiente Y | Área afectada del deslizamiento |
limpiar_numerico <- function(variable) {
variable <- as.character(variable)
variable <- gsub(",", ".", variable)
as.numeric(variable)
}
datos_regresion <- data.frame(
precipitation_7d_mm = limpiar_numerico(datos$precipitation_7d_mm),
area_affected_m2 = limpiar_numerico(datos$area_affected_m2),
terrain_slope_deg = limpiar_numerico(datos$terrain_slope_deg),
latitude = limpiar_numerico(datos$latitude),
longitude = limpiar_numerico(datos$longitude),
landslide_category = datos$landslide_category,
landslide_size = datos$landslide_size
)
datos_regresion <- datos_regresion[
is.finite(datos_regresion$precipitation_7d_mm) &
is.finite(datos_regresion$area_affected_m2) &
datos_regresion$precipitation_7d_mm > 0 &
datos_regresion$area_affected_m2 > 0,
]
x <- datos_regresion$precipitation_7d_mm
y <- datos_regresion$area_affected_m2
tabla_variables <- data.frame(
Variable = c(
"X",
"Y",
"Variable complementaria",
"Variable complementaria",
"Variable complementaria",
"Variable categórica complementaria",
"Variable categórica complementaria"
),
Nombre_en_dataset = c(
"precipitation_7d_mm",
"area_affected_m2",
"terrain_slope_deg",
"latitude",
"longitude",
"landslide_category",
"landslide_size"
),
Descripcion = c(
"Precipitación acumulada en 7 días",
"Área afectada del deslizamiento como representación numérica del tamaño",
"Pendiente del terreno",
"Latitud del evento",
"Longitud del evento",
"Categoría del deslizamiento",
"Tamaño categórico del deslizamiento"
),
Uso_en_modelo = c(
"Variable independiente",
"Variable dependiente",
"Variable considerada para Machine Learning",
"Variable considerada para Machine Learning",
"Variable considerada para Machine Learning",
"Variable considerada para Machine Learning",
"Variable considerada para Machine Learning"
)
)
knitr::kable(
tabla_variables,
caption = "Variables consideradas para el modelo logarítmico y para Machine Learning"
)
| Variable | Nombre_en_dataset | Descripcion | Uso_en_modelo |
|---|---|---|---|
| X | precipitation_7d_mm | Precipitación acumulada en 7 días | Variable independiente |
| Y | area_affected_m2 | Área afectada del deslizamiento como representación numérica del tamaño | Variable dependiente |
| Variable complementaria | terrain_slope_deg | Pendiente del terreno | Variable considerada para Machine Learning |
| Variable complementaria | latitude | Latitud del evento | Variable considerada para Machine Learning |
| Variable complementaria | longitude | Longitud del evento | Variable considerada para Machine Learning |
| Variable categórica complementaria | landslide_category | Categoría del deslizamiento | Variable considerada para Machine Learning |
| Variable categórica complementaria | landslide_size | Tamaño categórico del deslizamiento | Variable considerada para Machine Learning |
tabla_pares <- data.frame(
Precipitacion_7_dias_mm = x,
Area_afectada_m2 = y
)
knitr::kable(
head(tabla_pares, 10),
digits = 4,
caption = "Primeros diez pares de valores utilizados en el modelo logarítmico"
)
| Precipitacion_7_dias_mm | Area_afectada_m2 |
|---|---|
| 60.21 | 1879.8 |
| 115.77 | 2183.0 |
| 47.14 | 784.5 |
| 52.52 | 1815.4 |
| 12.51 | 1399.4 |
| 84.97 | 2568.7 |
| 121.28 | 2725.3 |
| 83.39 | 2167.9 |
| 93.87 | 1983.9 |
| 105.27 | 1835.7 |
resumen_variables <- data.frame(
Variable = c("Precipitación acumulada 7 días", "Área afectada"),
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 |
|---|---|---|---|---|
| Precipitación acumulada 7 días | 0.5 | 71.91 | 62.74 | 507.07 |
| Área afectada | 198.6 | 2366.48 | 1827.90 | 62703.70 |
ggplot(
datos_regresion,
aes(
x = precipitation_7d_mm,
y = area_affected_m2
)
) +
geom_point(
color = "blue",
alpha = 0.30,
size = 1.7
) +
labs(
title = "REGRESIÓN LOGARÍTMICA",
subtitle = "Nube de puntos entre precipitación acumulada y área afectada",
x = "Precipitación acumulada en 7 días (mm)",
y = "Área afectada del deslizamiento (m²)"
) +
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 la precipitación acumulada en 7 días, el área afectada del deslizamiento tiende a incrementarse de forma no lineal. Por ello se propone un modelo logarítmico.
La estructura matemática del modelo logarítmico es:
\[ \hat{y} = a + b\ln(x) \]
Donde:
modelo_logaritmico <- lm(
area_affected_m2 ~ log(precipitation_7d_mm),
data = datos_regresion
)
parametros <- coef(modelo_logaritmico)
intercepto <- as.numeric(parametros[1])
pendiente_log <- as.numeric(parametros[2])
y_estimado <- predict(modelo_logaritmico)
r_cuadrado <- summary(modelo_logaritmico)$r.squared
rmse <- sqrt(mean((y - y_estimado)^2))
tabla_modelo <- data.frame(
Parametro = c("a", "b", "R²", "RMSE"),
Valor = c(intercepto, pendiente_log, r_cuadrado, rmse),
Interpretacion = c(
"Intercepto del modelo logarítmico",
"Cambio estimado del área afectada respecto al logaritmo natural de la precipitación",
"Proporción de variabilidad explicada por el modelo",
"Error promedio aproximado del modelo"
)
)
knitr::kable(
tabla_modelo,
digits = 4,
caption = "Parámetros principales del modelo logarítmico"
)
| Parametro | Valor | Interpretacion |
|---|---|---|
| a | -3065.3291 | Intercepto del modelo logarítmico |
| b | 1341.3636 | Cambio estimado del área afectada respecto al logaritmo natural de la precipitación |
| R² | 0.2213 | Proporción de variabilidad explicada por el modelo |
| RMSE | 1884.8200 | Error promedio aproximado del modelo |
Ecuación logarítmica
Y = a + b * ln(x)
Y = -3065.33 + 1341.36 * ln(x)
R² = 0.2213
El modelo explica aproximadamente 22.13% de la variabilidad observada en el área afectada del deslizamiento.
RMSE = 1884.82 m²
tabla_coeficientes <- as.data.frame(coef(summary(modelo_logaritmico)))
tabla_coeficientes$Parametro <- rownames(tabla_coeficientes)
rownames(tabla_coeficientes) <- NULL
tabla_coeficientes <- tabla_coeficientes[
,
c(
"Parametro",
"Estimate",
"Std. Error",
"t value",
"Pr(>|t|)"
)
]
knitr::kable(
tabla_coeficientes,
digits = 4,
caption = "Resumen de coeficientes del modelo logarítmico"
)
| Parametro | Estimate | Std. Error | t value | Pr(>|t|) |
|---|---|---|---|---|
| (Intercept) | -3065.329 | 98.6547 | -31.0713 | 0 |
| log(precipitation_7d_mm) | 1341.364 | 23.9559 | 55.9930 | 0 |
x_secuencia <- seq(
min(x),
max(x),
length.out = 300
)
curva_logaritmica <- data.frame(
precipitation_7d_mm = x_secuencia,
area_estimada = intercepto + pendiente_log * log(x_secuencia)
)
if (pendiente_log >= 0) {
ecuacion_texto <- paste0(
"y = ",
round(intercepto, 2),
" + ",
round(pendiente_log, 2),
"ln(x) | R² = ",
round(r_cuadrado, 3)
)
} else {
ecuacion_texto <- paste0(
"y = ",
round(intercepto, 2),
" - ",
abs(round(pendiente_log, 2)),
"ln(x) | R² = ",
round(r_cuadrado, 3)
)
}
ggplot() +
geom_point(
data = datos_regresion,
aes(
x = precipitation_7d_mm,
y = area_affected_m2
),
color = "blue",
alpha = 0.30,
size = 1.7
) +
geom_line(
data = curva_logaritmica,
aes(
x = precipitation_7d_mm,
y = area_estimada
),
color = "red",
linewidth = 1.5
) +
labs(
title = "REGRESIÓN LOGARÍTMICA",
subtitle = ecuacion_texto,
x = "Precipitación acumulada en 7 días (mm)",
y = "Área afectada del deslizamiento (m²)"
) +
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 logarítmica",
"Significancia estadística de la relación observada-estimada",
"Variabilidad explicada por el modelo logarítmico",
"Error promedio aproximado del modelo en metros cuadrados"
)
)
knitr::kable(
tabla_evaluacion,
caption = "Evaluación del modelo logarítmico"
)
| Indicador | Valor | Interpretacion |
|---|---|---|
| Coeficiente de Pearson | 0.4704 | Relación entre los valores observados y los valores estimados por la curva logarítmica |
| p-value | < 0.00000000000000022 | Significancia estadística de la relación observada-estimada |
| R² | 0.2213 | Variabilidad explicada por el modelo logarítmico |
| RMSE | 1884.82 | Error promedio aproximado del modelo en metros cuadrados |
Coeficiente de Pearson observado-estimado: r = 0.4704
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
logarítmico fue construido con valores observados de precipitación
acumulada en 7 días entre x = 0.5 mm y x =
507.07 mm.
Además, para aplicar el logaritmo natural se
requiere que la variable independiente sea mayor que cero. En este caso,
el área afectada mínima observada fue 198.6
m².
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_precipitacion ||
valor_propuesto > max_precipitacion
) {
valor_estimado <- median(x)
observacion_estimacion <- paste(
"El valor propuesto está fuera del rango observado.",
"Se usó la mediana de la precipitación acumulada en 7 días para la demostración."
)
} else {
valor_estimado <- valor_propuesto
observacion_estimacion <- "El valor propuesto está dentro del rango observado."
}
nuevo_evento <- data.frame(
precipitation_7d_mm = valor_estimado
)
estimacion <- predict(
modelo_logaritmico,
newdata = nuevo_evento,
interval = "prediction",
level = 0.95
)
area_estimada <- estimacion[1, "fit"]
limite_inferior <- max(0, estimacion[1, "lwr"])
limite_superior <- estimacion[1, "upr"]
tabla_estimacion <- data.frame(
Precipitacion_7_dias_mm = valor_estimado,
Area_afectada_estimada_m2 = area_estimada,
Limite_inferior_95 = limite_inferior,
Limite_superior_95 = limite_superior
)
knitr::kable(
tabla_estimacion,
digits = 2,
caption = "Pronóstico generado por el modelo logarítmico"
)
| Precipitacion_7_dias_mm | Area_afectada_estimada_m2 | Limite_inferior_95 | Limite_superior_95 |
|---|---|---|---|
| 62.74 | 2486.57 | 0 | 6181.66 |
Para una precipitación acumulada en 7 días de:
62.74 mm
El área afectada estimada del deslizamiento es:
2486.57 m²
Intervalo de predicción 95%:
0 m² a 6181.66 m²
El modelo permitió evaluar la relación entre la precipitación acumulada en 7 días y el área afectada del deslizamiento mediante una función logarítmica.
El parámetro b = 1341.364, 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.47, con un p-value = < 0.00000000000000022. La relación observada-estimada resultó estadísticamente significativa.
El modelo explica aproximadamente 22.13% de la variabilidad del área afectada del deslizamiento.
Su uso debe limitarse al rango observado de precipitación acumulada y entenderse como una asociación estadística, no como una causalidad absoluta.
La regresión logarítmica fue desarrollada usando como variable independiente la precipitación acumulada en 7 días y como variable dependiente el área afectada del deslizamiento. La representación visual principal corresponde a la curva logarítmica ajustada sobre la nube de puntos en la escala original de los datos.