library(readxl)
library(ggplot2)
library(knitr)
datos <- read_excel(
"dataset_landslides.xlsx",
sheet = "Dataset_landslides"
)
Causa y efecto:
El índice de humedad del suelo se considera la variable independiente \((X)\), porque representa la cantidad relativa de humedad presente en el terreno y puede influir en la saturación y pérdida de estabilidad.
El área afectada del deslizamiento se considera la variable dependiente \((Y)\), porque representa el tamaño de la superficie impactada por el evento.
Dentro del modelo se establece:
limpiar_numerico <- function(variable) {
variable <- as.character(variable)
variable <- gsub(",", ".", variable)
as.numeric(variable)
}
datos$soil_moisture_index <- limpiar_numerico(
datos$soil_moisture_index
)
datos$area_affected_m2 <- limpiar_numerico(
datos$area_affected_m2
)
datos_originales <- datos[
is.finite(datos$soil_moisture_index) &
is.finite(datos$area_affected_m2) &
datos$soil_moisture_index >= 0 &
datos$soil_moisture_index <= 1 &
datos$area_affected_m2 > 0,
c(
"soil_moisture_index",
"area_affected_m2"
)
]
datos_originales <- datos_originales[
order(
datos_originales$soil_moisture_index
),
]
X_original <- datos_originales$soil_moisture_index
Y_original <- datos_originales$area_affected_m2
tabla_original <- data.frame(
X = X_original,
Y = Y_original
)
cat(
"Tamaño muestral original =",
nrow(
tabla_original
)
)
## Tamaño muestral original = 11033
knitr::kable(
head(
tabla_original,
20
),
digits = 4,
col.names = c(
"Índice de humedad del suelo",
"Área afectada del deslizamiento (m²)"
),
caption = paste(
"Tabla Nro. 1. Pares de valores originales del índice",
"de humedad del suelo y el área afectada del deslizamiento"
)
)
| Índice de humedad del suelo | Área afectada del deslizamiento (m²) |
|---|---|
| 0.0978 | 604.2 |
| 0.1229 | 920.3 |
| 0.1236 | 410.0 |
| 0.1240 | 1680.0 |
| 0.1254 | 982.7 |
| 0.1401 | 669.1 |
| 0.1494 | 2695.8 |
| 0.1494 | 1544.9 |
| 0.1499 | 1885.1 |
| 0.1502 | 1919.7 |
| 0.1510 | 688.2 |
| 0.1520 | 998.1 |
| 0.1523 | 1092.7 |
| 0.1524 | 1043.4 |
| 0.1539 | 573.5 |
| 0.1559 | 663.4 |
| 0.1576 | 570.9 |
| 0.1578 | 198.6 |
| 0.1586 | 3253.5 |
| 0.1634 | 4557.4 |
y_max_original <- ceiling(
max(
Y_original,
na.rm = TRUE
) / 5000
) * 5000
ggplot(
tabla_original,
aes(
x = X,
y = Y
)
) +
geom_point(
color = "#00A6D6",
alpha = 0.40,
size = 1.5
) +
labs(
title = "Gráfica Nro. 1",
subtitle = paste0(
"Diagrama original de dispersión entre el índice de humedad del suelo\n",
"y el área afectada del deslizamiento"
),
x = "Índice de humedad del suelo",
y = "Área afectada del deslizamiento (m²)"
) +
scale_x_continuous(
limits = c(
0,
1
),
breaks = seq(
0,
1,
by = 0.1
),
expand = expansion(
mult = 0,
add = 0
)
) +
scale_y_continuous(
limits = c(
0,
y_max_original
),
expand = expansion(
mult = 0,
add = 0
)
) +
coord_cartesian(
xlim = c(
0,
1
),
ylim = c(
0,
y_max_original
),
expand = FALSE
) +
theme_bw(
base_size = 14
) +
theme(
plot.title = element_text(
hjust = 0.5,
face = "bold",
color = "#6D213C",
size = 17
),
plot.subtitle = element_text(
hjust = 0.5,
face = "bold",
size = 13,
lineheight = 1.1
),
axis.title = element_text(
face = "bold"
),
panel.grid.minor = element_blank()
)
Simplificación de los datos:
Los registros se ordenan según el índice de humedad del suelo y se dividen en 15 grupos con cantidades similares de observaciones. En cada grupo se calcula la mediana de la humedad y la mediana del área afectada.
Este tratamiento reduce la dispersión de los datos originales y permite observar con mayor claridad la curvatura de la relación sin inventar ni modificar observaciones individuales.
numero_grupos <- 15
cortes <- quantile(
datos_originales$soil_moisture_index,
probs = seq(
0,
1,
length.out = numero_grupos + 1
),
na.rm = TRUE
)
cortes <- unique(
cortes
)
datos_originales$grupo <- cut(
datos_originales$soil_moisture_index,
breaks = cortes,
include.lowest = TRUE,
labels = FALSE
)
datos_prom <- aggregate(
cbind(
soil_moisture_index,
area_affected_m2
) ~ grupo,
data = datos_originales,
FUN = median
)
datos_prom <- datos_prom[
order(
datos_prom$soil_moisture_index
),
]
X <- datos_prom$soil_moisture_index
Y <- datos_prom$area_affected_m2
cat(
"Tamaño muestral utilizado en el modelo =",
nrow(
datos_prom
)
)
## Tamaño muestral utilizado en el modelo = 15
tabla_simplificada <- data.frame(
X = X,
Y = Y
)
knitr::kable(
tabla_simplificada,
digits = 4,
col.names = c(
"Índice de humedad representativo",
"Área afectada representativa (m²)"
),
caption = paste(
"Tabla Nro. 2. Pares representativos del índice",
"de humedad del suelo y el área afectada"
)
)
| Índice de humedad representativo | Área afectada representativa (m²) |
|---|---|
| 0.2955 | 1091.10 |
| 0.4054 | 1202.10 |
| 0.4838 | 1336.40 |
| 0.5533 | 1413.10 |
| 0.6163 | 1538.15 |
| 0.6748 | 1603.60 |
| 0.7238 | 1647.40 |
| 0.7727 | 1665.60 |
| 0.8183 | 1793.60 |
| 0.8610 | 2029.50 |
| 0.8990 | 2162.90 |
| 0.9321 | 2289.70 |
| 0.9606 | 2634.10 |
| 0.9834 | 3110.70 |
| 0.9971 | 4809.85 |
y_max_simplificado <- ceiling(
max(
Y,
na.rm = TRUE
) / 500
) * 500
ggplot(
tabla_simplificada,
aes(
x = X,
y = Y
)
) +
geom_point(
color = "#00A6D6",
alpha = 1,
size = 3.2
) +
labs(
title = "Gráfica Nro. 2",
subtitle = paste0(
"Diagrama simplificado de dispersión entre el índice de humedad del suelo\n",
"y el área afectada del deslizamiento"
),
x = "Índice de humedad del suelo",
y = "Área afectada del deslizamiento (m²)"
) +
scale_x_continuous(
limits = c(
0,
1
),
breaks = seq(
0,
1,
by = 0.1
),
expand = expansion(
mult = 0,
add = 0
)
) +
scale_y_continuous(
limits = c(
0,
y_max_simplificado
),
expand = expansion(
mult = 0,
add = 0
)
) +
coord_cartesian(
xlim = c(
0,
1
),
ylim = c(
0,
y_max_simplificado
),
expand = FALSE
) +
theme_bw(
base_size = 14
) +
theme(
plot.title = element_text(
hjust = 0.5,
face = "bold",
color = "#6D213C",
size = 17
),
plot.subtitle = element_text(
hjust = 0.5,
face = "bold",
size = 13,
lineheight = 1.1
),
axis.title = element_text(
face = "bold"
),
panel.grid.minor = element_blank()
)
La distribución de los puntos presenta una tendencia creciente con cambios en la pendiente. El área afectada aumenta lentamente en niveles medios de humedad y con mayor rapidez cuando el índice se aproxima a la saturación. Por esta razón se propone un modelo polinómico de grado 4.
Modelo polinómico general de grado 4:
\[ Y = a+ bX+ cX^2+ dX^3+ eX^4 \]
Modelo polinómico aplicado al estudio:
\[ \text{Área afectada} = a+ b(\text{Humedad})+ c(\text{Humedad})^2+ d(\text{Humedad})^3+ e(\text{Humedad})^4 \]
Ajuste del modelo:
modelo_pol <- lm(
Y ~ poly(
X,
4,
raw = TRUE
)
)
param <- coef(
modelo_pol
)
a_est <- unname(
param[1]
)
b_est <- unname(
param[2]
)
c_est <- unname(
param[3]
)
d_est <- unname(
param[4]
)
e_est <- unname(
param[5]
)
a_est
## [1] 15836.51
b_est
## [1] -117708.7
c_est
## [1] 330237.6
d_est
## [1] -386458.9
e_est
## [1] 162219.3
Ecuación polinómica obtenida:
\[ \widehat{Y} = 15836.5083 - 1.177e+05X + 3.302e+05X^2 - 3.865e+05X^3 + 1.622e+05X^4 \]
Justificación del uso de la regresión lineal
(lm)
Aunque el modelo presenta una relación polinómica, se utiliza la
función lm() porque la ecuación es lineal respecto a sus
parámetros.
El modelo de grado 4 es:
\[ Y = a+ bX+ cX^2+ dX^3+ eX^4 \]
Se definen los términos:
\[ X_1=X, \qquad X_2=X^2, \qquad X_3=X^3, \qquad X_4=X^4 \]
y los parámetros:
\[ \beta_0=a, \qquad \beta_1=b, \qquad \beta_2=c, \qquad \beta_3=d, \qquad \beta_4=e \]
Por tanto:
\[ Y = \beta_0+ \beta_1X_1+ \beta_2X_2+ \beta_3X_3+ \beta_4X_4 \]
Como la ecuación es lineal respecto a los parámetros, puede estimarse en R mediante:
modelo_pol <- lm(
Y ~ poly(
X,
4,
raw = TRUE
)
)
Finalmente, se reconstruye el modelo:
\[ \text{Área afectada} = a+ b(\text{Humedad})+ c(\text{Humedad})^2+ d(\text{Humedad})^3+ e(\text{Humedad})^4 \]
x_min_calibracion <- min(
X,
na.rm = TRUE
)
x_max_calibracion <- max(
X,
na.rm = TRUE
)
X_curva <- seq(
x_min_calibracion,
x_max_calibracion,
length.out = 500
)
Y_curva <- a_est +
b_est * X_curva +
c_est * X_curva^2 +
d_est * X_curva^3 +
e_est * X_curva^4
curva_polinomica <- data.frame(
X = X_curva,
Y = Y_curva
)
y_max_modelo <- ceiling(
max(
c(
Y,
Y_curva
),
na.rm = TRUE
) / 500
) * 500
ggplot() +
geom_point(
data = tabla_simplificada,
aes(
x = X,
y = Y
),
color = "#00A6D6",
alpha = 1,
size = 3.2
) +
geom_line(
data = curva_polinomica,
aes(
x = X,
y = Y
),
color = "red",
linewidth = 1.5
) +
labs(
title = "Gráfica Nro. 3",
subtitle = paste0(
"Modelo polinómico de grado 4 entre el índice de humedad del suelo\n",
"y el área afectada del deslizamiento"
),
x = "Índice de humedad del suelo",
y = "Área afectada del deslizamiento (m²)"
) +
scale_x_continuous(
limits = c(
0,
1
),
breaks = seq(
0,
1,
by = 0.1
),
expand = expansion(
mult = 0,
add = 0
)
) +
scale_y_continuous(
limits = c(
0,
y_max_modelo
),
expand = expansion(
mult = 0,
add = 0
)
) +
coord_cartesian(
xlim = c(
0,
1
),
ylim = c(
0,
y_max_modelo
),
expand = FALSE
) +
theme_bw(
base_size = 14
) +
theme(
plot.title = element_text(
hjust = 0.5,
face = "bold",
color = "#6D213C",
size = 17
),
plot.subtitle = element_text(
hjust = 0.5,
face = "bold",
size = 13,
lineheight = 1.1
),
axis.title = element_text(
face = "bold"
),
panel.grid.minor = element_blank(),
legend.position = "none"
)
r <- cor(
X,
Y
) * 100
R2 <- summary(
modelo_pol
)$r.squared * 100
cat(
"Coeficiente de correlación (r) =",
round(
r,
2
),
"%\n"
)
## Coeficiente de correlación (r) = 76.1 %
cat(
"Coeficiente de determinación (R²) =",
round(
R2,
2
),
"%"
)
## Coeficiente de determinación (R²) = 89.75 %
El coeficiente de correlación es de 76.1 %, lo que representa una relación positiva fuerte entre el índice de humedad y el área afectada.
El coeficiente de determinación es de 89.75 %, lo que indica el porcentaje de variabilidad de los puntos representativos explicado por el modelo polinómico de grado 4.
humedad_dominio <- seq(
0,
1,
length.out = 10001
)
areas_dominio <- a_est +
b_est * humedad_dominio +
c_est * humedad_dominio^2 +
d_est * humedad_dominio^3 +
e_est * humedad_dominio^4
area_min_dominio <- min(
areas_dominio,
na.rm = TRUE
)
area_max_dominio <- max(
areas_dominio,
na.rm = TRUE
)
modelo_fuera_dominio <- any(
areas_dominio < 0
)
respuesta_restriccion <- ifelse(
modelo_fuera_dominio,
"Sí",
"No"
)
Dominios:
\[ D_X = \left\{ X\in\mathbb{R}: 0\leq X\leq1 \right\} \]
\[ D_Y = \left\{ Y\in\mathbb{R}: Y\geq0 \right\} \]
Pregunta: ¿Existe algún valor de \(X\) que, reemplazado en el modelo matemático, genere un valor fuera del dominio de \(Y\)?
Respuesta: No.
El modelo no genera áreas negativas dentro del dominio físico de la humedad. Sus estimaciones se encuentran aproximadamente entre 954.15 y 15836.51 m².
El modelo fue calibrado con índices de humedad representativos entre 0.2955 y 0.9971. Los valores externos a este intervalo, aunque permanezcan entre 0 y 1, corresponden a extrapolaciones y no deben interpretarse con la misma confianza.
# Pregunta de cantidad
humedad_objetivo <- 0.80
area_objetivo <- a_est +
b_est * humedad_objetivo +
c_est * humedad_objetivo^2 +
d_est * humedad_objetivo^3 +
e_est * humedad_objetivo^4
# Pregunta de porcentaje
incremento_pct <- 0.10
humedad_final <- humedad_objetivo *
(
1 +
incremento_pct
)
if (
humedad_final > 1
) {
stop(
"El nuevo índice de humedad supera el dominio físico de 1."
)
}
area_final <- a_est +
b_est * humedad_final +
c_est * humedad_final^2 +
d_est * humedad_final^3 +
e_est * humedad_final^4
porcentaje_cambio_area <- (
(
area_final -
area_objetivo
) /
area_objetivo
) * 100
Pregunta de cantidad
¿Cuál es el área afectada esperada cuando el índice de humedad del suelo es 0.80?
Resultado estimado: 1599.62 m²
Pregunta de porcentaje
¿En qué porcentaje cambia el área afectada esperada cuando el índice de humedad del suelo aumenta un 10 %, pasando de 0.80 a 0.88?
Resultado estimado: 19.4 %
En conclusión:
Entre el índice de humedad del suelo y el área afectada del deslizamiento existe una relación no lineal representada mediante el modelo polinómico de grado 4:
\[ \widehat{Y} = 15836.5083 - 1.177e+05X + 3.302e+05X^2 - 3.865e+05X^3 + 1.622e+05X^4 \]
El coeficiente de correlación fue de 76.1 % y el coeficiente de determinación fue de 89.75 %. El tratamiento mediante 15 grupos representativos permitió observar con mayor claridad el cambio de pendiente y el crecimiento acelerado del área afectada cuando la humedad se aproxima a la saturación.
El modelo no genera áreas negativas dentro del dominio físico del índice de humedad.