Inicio Fin

Proyecto de regresiones

MODELO 1: REGRESIÓN LINEAL SIMPLE

# =========================================================
# PROYECTO DE REGRESIONES
# MODELO 1: REGRESIÓN LINEAL SIMPLE
# X = Precipitación acumulada en 7 días
# Y = Área afectada por deslizamientos
# =========================================================


# =========================================================

1. LIBRERÍAS Y CARGA DEL DATASET

# 1. LIBRERÍAS Y CARGA DEL DATASET
# =========================================================

# Para este modelo se usarán funciones base de R.
# No se requieren librerías adicionales.

# Evita la notación científica en números grandes
options(scipen = 999)

# Cargar dataset complementario
datos <- read.csv(
  "dataset_landslides_modelado.csv",
  fileEncoding = "UTF-8-BOM",
  stringsAsFactors = FALSE,
  na.strings = c("", "NA")
)

# Verificación inicial del dataset
head(datos)
##   event_id event_date event_year event_month  country_name country_code
## 1      684 2008-08-01       2008           8         China           CN
## 2      956 2009-01-02       2009           1 United States           US
## 3      973 2007-01-19       2007           1          Peru           PE
## 4     1067 2009-07-31       2009           7         Nepal           NP
## 5     2603 2010-10-16       2010          10   Philippines           PH
## 6     4203 2012-02-16       2012           2   Philippines           PH
##   landslide_category landslide_trigger landslide_size landslide_setting
## 1          landslide              rain          large              mine
## 2           mudslide          downpour          small           unknown
## 3          landslide          downpour          large           unknown
## 4          landslide           monsoon         medium           unknown
## 5          landslide  tropical_cyclone         medium           unknown
## 6          landslide          downpour         medium           unknown
##   fatality_count_observed longitude latitude precipitation_7d_mm_synthetic
## 1                      11  107.4500  32.5625                         60.21
## 2                       0 -122.6630  45.4200                        115.77
## 3                      10  -75.3587 -11.1295                         47.14
## 4                       1   81.7080  28.8378                         52.52
## 5                       0  123.8978  10.3336                         12.51
## 6                       0  124.9668  10.7004                         84.97
##   precipitation_30d_mm_synthetic terrain_slope_deg_synthetic
## 1                         228.20                       28.14
## 2                         326.56                       33.00
## 3                         207.24                       19.77
## 4                         229.48                       22.85
## 5                          64.64                       15.65
## 6                         396.80                       23.76
##   elevation_m_synthetic distance_to_road_km_synthetic
## 1                2431.8                        22.544
## 2                1357.9                         0.863
## 3                1564.0                         1.081
## 4                1500.8                         0.401
## 5                1069.9                         2.708
## 6                2024.7                         1.110
##   population_density_km2_synthetic soil_moisture_index_synthetic
## 1                              4.3                        0.6991
## 2                             45.4                        0.9316
## 3                             17.3                        0.8163
## 4                              6.1                        0.8226
## 5                            704.9                        0.5915
## 6                              7.5                        0.9407
##   land_cover_risk_index_synthetic area_affected_m2_synthetic
## 1                           53.96                     1879.8
## 2                           67.17                     2183.0
## 3                           68.85                      784.5
## 4                           52.53                     1815.4
## 5                           47.25                     1399.4
## 6                           63.35                     2568.7
##   susceptibility_index_synthetic event_impact_score_synthetic
## 1                          83.27                        44.03
## 2                          93.48                        56.96
## 3                          87.15                        39.25
## 4                          74.52                        25.51
## 5                          37.58                        38.82
## 6                          89.74                        53.81
##   fatality_risk_probability_synthetic fatality_count_simulated
## 1                              0.0332                        0
## 2                              0.1648                        0
## 3                              0.0308                        0
## 4                              0.0318                        0
## 5                              0.0212                        0
## 6                              0.0671                        0
##   fatal_event_simulated severity_class_simulated
## 1                    no           sin_fallecidos
## 2                    no           sin_fallecidos
## 3                    no           sin_fallecidos
## 4                    no           sin_fallecidos
## 5                    no           sin_fallecidos
## 6                    no           sin_fallecidos
##                                                          dataset_note
## 1 Variables con sufijo _synthetic son simuladas para fines académicos
## 2 Variables con sufijo _synthetic son simuladas para fines académicos
## 3 Variables con sufijo _synthetic son simuladas para fines académicos
## 4 Variables con sufijo _synthetic son simuladas para fines académicos
## 5 Variables con sufijo _synthetic son simuladas para fines académicos
## 6 Variables con sufijo _synthetic son simuladas para fines académicos
dim(datos)
## [1] 11033    29
names(datos)
##  [1] "event_id"                            "event_date"                         
##  [3] "event_year"                          "event_month"                        
##  [5] "country_name"                        "country_code"                       
##  [7] "landslide_category"                  "landslide_trigger"                  
##  [9] "landslide_size"                      "landslide_setting"                  
## [11] "fatality_count_observed"             "longitude"                          
## [13] "latitude"                            "precipitation_7d_mm_synthetic"      
## [15] "precipitation_30d_mm_synthetic"      "terrain_slope_deg_synthetic"        
## [17] "elevation_m_synthetic"               "distance_to_road_km_synthetic"      
## [19] "population_density_km2_synthetic"    "soil_moisture_index_synthetic"      
## [21] "land_cover_risk_index_synthetic"     "area_affected_m2_synthetic"         
## [23] "susceptibility_index_synthetic"      "event_impact_score_synthetic"       
## [25] "fatality_risk_probability_synthetic" "fatality_count_simulated"           
## [27] "fatal_event_simulated"               "severity_class_simulated"           
## [29] "dataset_note"
str(datos)
## 'data.frame':    11033 obs. of  29 variables:
##  $ event_id                           : int  684 956 973 1067 2603 4203 4290 225 236 873 ...
##  $ event_date                         : chr  "2008-08-01" "2009-01-02" "2007-01-19" "2009-07-31" ...
##  $ event_year                         : int  2008 2009 2007 2009 2010 2012 2012 2007 2007 2008 ...
##  $ event_month                        : int  8 1 1 7 10 2 3 9 9 11 ...
##  $ country_name                       : chr  "China" "United States" "Peru" "Nepal" ...
##  $ country_code                       : chr  "CN" "US" "PE" "NP" ...
##  $ landslide_category                 : chr  "landslide" "mudslide" "landslide" "landslide" ...
##  $ landslide_trigger                  : chr  "rain" "downpour" "downpour" "monsoon" ...
##  $ landslide_size                     : chr  "large" "small" "large" "medium" ...
##  $ landslide_setting                  : chr  "mine" "unknown" "unknown" "unknown" ...
##  $ fatality_count_observed            : int  11 0 10 1 0 0 0 3 NA 2 ...
##  $ longitude                          : num  107.5 -122.7 -75.4 81.7 123.9 ...
##  $ latitude                           : num  32.6 45.4 -11.1 28.8 10.3 ...
##  $ precipitation_7d_mm_synthetic      : num  60.2 115.8 47.1 52.5 12.5 ...
##  $ precipitation_30d_mm_synthetic     : num  228.2 326.6 207.2 229.5 64.6 ...
##  $ terrain_slope_deg_synthetic        : num  28.1 33 19.8 22.9 15.7 ...
##  $ elevation_m_synthetic              : num  2432 1358 1564 1501 1070 ...
##  $ distance_to_road_km_synthetic      : num  22.544 0.863 1.081 0.401 2.708 ...
##  $ population_density_km2_synthetic   : num  4.3 45.4 17.3 6.1 704.9 ...
##  $ soil_moisture_index_synthetic      : num  0.699 0.932 0.816 0.823 0.592 ...
##  $ land_cover_risk_index_synthetic    : num  54 67.2 68.8 52.5 47.2 ...
##  $ area_affected_m2_synthetic         : num  1880 2183 784 1815 1399 ...
##  $ susceptibility_index_synthetic     : num  83.3 93.5 87.2 74.5 37.6 ...
##  $ event_impact_score_synthetic       : num  44 57 39.2 25.5 38.8 ...
##  $ fatality_risk_probability_synthetic: num  0.0332 0.1648 0.0308 0.0318 0.0212 ...
##  $ fatality_count_simulated           : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ fatal_event_simulated              : chr  "no" "no" "no" "no" ...
##  $ severity_class_simulated           : chr  "sin_fallecidos" "sin_fallecidos" "sin_fallecidos" "sin_fallecidos" ...
##  $ dataset_note                       : chr  "Variables con sufijo _synthetic son simuladas para fines académicos" "Variables con sufijo _synthetic son simuladas para fines académicos" "Variables con sufijo _synthetic son simuladas para fines académicos" "Variables con sufijo _synthetic son simuladas para fines académicos" ...
# Verificar valores faltantes
colSums(is.na(datos))
##                            event_id                          event_date 
##                                   0                                   0 
##                          event_year                         event_month 
##                                   0                                   0 
##                        country_name                        country_code 
##                                1562                                1564 
##                  landslide_category                   landslide_trigger 
##                                   1                                  23 
##                      landslide_size                   landslide_setting 
##                                   9                                  69 
##             fatality_count_observed                           longitude 
##                                1385                                   0 
##                            latitude       precipitation_7d_mm_synthetic 
##                                   0                                   0 
##      precipitation_30d_mm_synthetic         terrain_slope_deg_synthetic 
##                                   0                                   0 
##               elevation_m_synthetic       distance_to_road_km_synthetic 
##                                   0                                   0 
##    population_density_km2_synthetic       soil_moisture_index_synthetic 
##                                   0                                   0 
##     land_cover_risk_index_synthetic          area_affected_m2_synthetic 
##                                   0                                   0 
##      susceptibility_index_synthetic        event_impact_score_synthetic 
##                                   0                                   0 
## fatality_risk_probability_synthetic            fatality_count_simulated 
##                                   0                                   0 
##               fatal_event_simulated            severity_class_simulated 
##                                   0                                   0 
##                        dataset_note 
##                                   0
# =========================================================

2. SELECCIÓN DE DOS VARIABLES

# 2. SELECCIÓN DE DOS VARIABLES
# =========================================================

# Variable independiente o explicativa (X)
# Precipitación acumulada durante los 7 días previos al evento
x <- datos$precipitation_7d_mm_synthetic

# Variable dependiente o respuesta (Y)
# Área afectada por el deslizamiento
y <- datos$area_affected_m2_synthetic

# Comprobar que ambas variables sean numéricas
is.numeric(x)
## [1] TRUE
is.numeric(y)
## [1] TRUE
# Crear base específica para la regresión
datos_regresion <- data.frame(
  precipitation_7d_mm_synthetic = x,
  area_affected_m2_synthetic = y
)

# Eliminar valores faltantes, por seguridad
datos_regresion <- na.omit(datos_regresion)

# Actualizar X y Y con datos depurados
x <- datos_regresion$precipitation_7d_mm_synthetic
y <- datos_regresion$area_affected_m2_synthetic


# =========================================================

3. TABLA DE PARES DE VALORES

# 3. TABLA DE PARES DE VALORES
# =========================================================

tabla_pares <- data.frame(
  Precipitacion_7_dias_mm = x,
  Area_afectada_m2 = y
)

# Mostrar los primeros pares de valores
head(tabla_pares, 10)
##    Precipitacion_7_dias_mm Area_afectada_m2
## 1                    60.21           1879.8
## 2                   115.77           2183.0
## 3                    47.14            784.5
## 4                    52.52           1815.4
## 5                    12.51           1399.4
## 6                    84.97           2568.7
## 7                   121.28           2725.3
## 8                    83.39           2167.9
## 9                    93.87           1983.9
## 10                  105.27           1835.7
# Resumen estadístico de ambas variables
summary(tabla_pares)
##  Precipitacion_7_dias_mm Area_afectada_m2 
##  Min.   :  0.50          Min.   :  198.6  
##  1st Qu.: 38.73          1st Qu.: 1204.0  
##  Median : 62.74          Median : 1827.9  
##  Mean   : 71.91          Mean   : 2366.5  
##  3rd Qu.: 94.77          3rd Qu.: 2827.5  
##  Max.   :507.07          Max.   :62703.7
# Guardar tabla de pares, opcional
write.csv(
  tabla_pares,
  "tabla_pares_precipitacion_area.csv",
  row.names = FALSE,
  fileEncoding = "UTF-8"
)


# =========================================================

4. GRÁFICA: NUBE DE PUNTOS / DIAGRAMA DE DISPERSIÓN

# 4. GRÁFICA: NUBE DE PUNTOS / DIAGRAMA DE DISPERSIÓN
# =========================================================

plot(
  x,
  y,
  main = "Diagrama de dispersión: precipitación y área afectada",
  xlab = "Precipitación acumulada en 7 días (mm)",
  ylab = "Área afectada por deslizamiento (m²)",
  pch = 16,
  col = rgb(0.12, 0.34, 0.72, 0.25),
  cex = 0.7
)

grid()

# =========================================================

5. CONJETURA Y ESTRUCTURA MATEMÁTICA DEL MODELO

# 5. CONJETURA Y ESTRUCTURA MATEMÁTICA DEL MODELO
# =========================================================

# Según la nube de puntos se propone una relación lineal positiva:
# a mayor precipitación acumulada, mayor área afectada estimada.

# Estructura matemática del modelo:
# y_estimado = a + b*x
#
# Donde:
# y_estimado = área afectada estimada en m²
# x = precipitación acumulada en 7 días en mm
# a = intercepto
# b = pendiente


# =========================================================

6. CÁLCULO DE PARÁMETROS DEL MODELO

# 6. CÁLCULO DE PARÁMETROS DEL MODELO
# =========================================================

modelo_lineal <- lm(
  area_affected_m2_synthetic ~ precipitation_7d_mm_synthetic,
  data = datos_regresion
)

# Resumen completo del modelo
summary(modelo_lineal)
## 
## Call:
## lm(formula = area_affected_m2_synthetic ~ precipitation_7d_mm_synthetic, 
##     data = datos_regresion)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
##  -4862   -815   -139    562  53991 
## 
## Coefficients:
##                               Estimate Std. Error t value             Pr(>|t|)
## (Intercept)                   222.3055    28.8884   7.695   0.0000000000000153
## precipitation_7d_mm_synthetic  29.8185     0.3383  88.136 < 0.0000000000000002
##                                  
## (Intercept)                   ***
## precipitation_7d_mm_synthetic ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1636 on 11031 degrees of freedom
## Multiple R-squared:  0.4132, Adjusted R-squared:  0.4132 
## F-statistic:  7768 on 1 and 11031 DF,  p-value: < 0.00000000000000022
# Extraer intercepto y pendiente
parametros <- coef(modelo_lineal)

intercepto <- parametros[1]
pendiente <- parametros[2]

cat(
  "Intercepto =", round(intercepto, 2), "\n"
)
## Intercepto = 222.31
cat(
  "Pendiente =", round(pendiente, 2), "\n"
)
## Pendiente = 29.82
# Mostrar ecuación de regresión
cat(
  "\nECUACIÓN DEL MODELO LINEAL:\n",
  "Área afectada estimada =",
  round(intercepto, 2),
  "+",
  round(pendiente, 2),
  "* Precipitación acumulada en 7 días\n"
)
## 
## ECUACIÓN DEL MODELO LINEAL:
##  Área afectada estimada = 222.31 + 29.82 * Precipitación acumulada en 7 días
# Coeficiente de determinación
r_cuadrado <- summary(modelo_lineal)$r.squared

cat(
  "\nCoeficiente de determinación R² =",
  round(r_cuadrado, 4),
  "\n"
)
## 
## Coeficiente de determinación R² = 0.4132
# =========================================================

7. SUPERPONER EL MODELO SOBRE LA NUBE DE PUNTOS

# 7. SUPERPONER EL MODELO SOBRE LA NUBE DE PUNTOS
# =========================================================

plot(
  x,
  y,
  main = "Regresión lineal: precipitación y área afectada",
  xlab = "Precipitación acumulada en 7 días (mm)",
  ylab = "Área afectada por deslizamiento (m²)",
  pch = 16,
  col = rgb(0.12, 0.34, 0.72, 0.25),
  cex = 0.7
)

grid()

abline(
  modelo_lineal,
  col = "red",
  lwd = 3
)

legend(
  "topleft",
  legend = c(
    "Eventos registrados",
    "Recta de regresión"
  ),
  col = c(
    rgb(0.12, 0.34, 0.72, 0.70),
    "red"
  ),
  pch = c(16, NA),
  lty = c(NA, 1),
  lwd = c(NA, 3),
  cex = 0.9,
  bty = "n"
)

mtext(
  paste0(
    "y = ", round(intercepto, 2),
    " + ", round(pendiente, 2),
    "x     R² = ", round(r_cuadrado, 3)
  ),
  side = 3,
  line = 0.2,
  cex = 0.85
)

# =========================================================

8. COVARIANZA Y TEST DE CORRELACIÓN DE PEARSON

# 8. COVARIANZA Y TEST DE CORRELACIÓN DE PEARSON
# =========================================================

# Covarianza
covarianza_xy <- cov(x, y)

cat(
  "\nCovarianza entre precipitación y área afectada =",
  round(covarianza_xy, 2),
  "\n"
)
## 
## Covarianza entre precipitación y área afectada = 63227.27
# Test de Pearson
pearson_lineal <- cor.test(
  x,
  y,
  method = "pearson"
)

pearson_lineal
## 
##  Pearson's product-moment correlation
## 
## data:  x and y
## t = 88.136, df = 11031, p-value < 0.00000000000000022
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.6317331 0.6536351
## sample estimates:
##       cor 
## 0.6428155
# Extraer resultados principales
r_pearson <- pearson_lineal$estimate
p_valor <- pearson_lineal$p.value

cat(
  "\nCoeficiente de Pearson r =",
  round(r_pearson, 3),
  "\n"
)
## 
## Coeficiente de Pearson r = 0.643
cat(
  "p-value =",
  format.pval(p_valor, digits = 4),
  "\n"
)
## p-value = < 0.00000000000000022
# =========================================================

8.1. RESTRICCIONES DEL MODELO

# 8.1 RESTRICCIONES DEL MODELO
# =========================================================

# El modelo debe aplicarse solamente dentro del rango observado
# de precipitación de la muestra.

min_precipitacion <- min(x)
max_precipitacion <- max(x)

cat(
  "\nRango válido de precipitación observado:\n",
  round(min_precipitacion, 2),
  "a",
  round(max_precipitacion, 2),
  "mm.\n"
)
## 
## Rango válido de precipitación observado:
##  0.5 a 507.07 mm.
cat(
  "No se recomienda estimar valores fuera de este rango.\n"
)
## No se recomienda estimar valores fuera de este rango.
# =========================================================

9. ESTIMACIÓN MEDIANTE EL MODELO

# 9. ESTIMACIÓN MEDIANTE EL MODELO
# =========================================================

# Valor de precipitación para realizar una estimación
valor_estimado <- 150

# Verificar que esté dentro del rango observado
if (
  valor_estimado < min_precipitacion ||
  valor_estimado > max_precipitacion
) {
  
  cat(
    "\nADVERTENCIA:\n",
    "El valor seleccionado está fuera del rango observado.\n",
    "La estimación sería una extrapolación y debe interpretarse con cautela.\n"
  )
  
} else {
  
  nuevo_evento <- data.frame(
    precipitation_7d_mm_synthetic = valor_estimado
  )
  
  estimacion <- predict(
    modelo_lineal,
    newdata = nuevo_evento,
    interval = "prediction",
    level = 0.95
  )
  
  print(estimacion)
  
  cat(
    "\nCon",
    valor_estimado,
    "mm de precipitación acumulada en 7 días,\n",
    "el modelo estima un área afectada de",
    round(estimacion[1, "fit"], 2),
    "m².\n"
  )
  
  cat(
    "Intervalo de predicción al 95%:",
    round(estimacion[1, "lwr"], 2),
    "a",
    round(estimacion[1, "upr"], 2),
    "m².\n"
  )
}
##        fit      lwr     upr
## 1 4695.087 1487.035 7903.14
## 
## Con 150 mm de precipitación acumulada en 7 días,
##  el modelo estima un área afectada de 4695.09 m².
## Intervalo de predicción al 95%: 1487.03 a 7903.14 m².
# =========================================================

10. CONCLUSIÓN DEL MODELO

# 10. CONCLUSIÓN DEL MODELO
# =========================================================

cat(
  "\n=============================================\n",
  "CONCLUSIÓN DEL MODELO DE REGRESIÓN LINEAL\n",
  "=============================================\n"
)
## 
## =============================================
##  CONCLUSIÓN DEL MODELO DE REGRESIÓN LINEAL
##  =============================================
cat(
  "La covarianza entre precipitación acumulada y área afectada fue de",
  round(covarianza_xy, 2),
  ".\n"
)
## La covarianza entre precipitación acumulada y área afectada fue de 63227.27 .
cat(
  "Al ser positiva, indica una asociación directa entre ambas variables.\n"
)
## Al ser positiva, indica una asociación directa entre ambas variables.
cat(
  "El coeficiente de Pearson fue r =",
  round(r_pearson, 3),
  "con un p-value de",
  format.pval(p_valor, digits = 4),
  ".\n"
)
## El coeficiente de Pearson fue r = 0.643 con un p-value de < 0.00000000000000022 .
cat(
  "Esto indica una relación lineal positiva estadísticamente significativa.\n"
)
## Esto indica una relación lineal positiva estadísticamente significativa.
cat(
  "El modelo explica aproximadamente",
  round(r_cuadrado * 100, 2),
  "% de la variabilidad observada en el área afectada.\n"
)
## El modelo explica aproximadamente 41.32 % de la variabilidad observada en el área afectada.
cat(
  "La pendiente indica que, en promedio, por cada aumento de 1 mm\n",
  "de precipitación acumulada en 7 días, el área afectada estimada cambia en",
  round(pendiente, 2),
  "m².\n"
)
## La pendiente indica que, en promedio, por cada aumento de 1 mm
##  de precipitación acumulada en 7 días, el área afectada estimada cambia en 29.82 m².
cat(
  "Este modelo permite realizar estimaciones aproximadas dentro del rango\n",
  "de datos observados, pero representa una asociación estadística y no una\n",
  "demostración de causalidad absoluta.\n"
)
## Este modelo permite realizar estimaciones aproximadas dentro del rango
##  de datos observados, pero representa una asociación estadística y no una
##  demostración de causalidad absoluta.
# =========================================================

MODELO 2: REGRESIÓN EXPONENCIAL

# MODELO 2: REGRESIÓN EXPONENCIAL
# X = Precipitación acumulada en 7 días
# Y = Área afectada por deslizamientos
# =========================================================


# =========================================================

1. LIBRERÍAS Y DATOS

# 1. LIBRERÍAS Y DATOS
# =========================================================

# Se reutiliza el dataset ya cargado: datos
# No se requieren librerías adicionales.


# =========================================================

2. SELECCIÓN DE VARIABLES

# 2. SELECCIÓN DE VARIABLES
# =========================================================

x_exp <- datos$precipitation_7d_mm_synthetic
y_exp <- datos$area_affected_m2_synthetic

datos_exponencial <- data.frame(
  precipitacion_7_dias_mm = x_exp,
  area_afectada_m2 = y_exp
)

# Para usar log(Y), el área afectada debe ser mayor que cero
datos_exponencial <- subset(
  datos_exponencial,
  !is.na(precipitacion_7_dias_mm) &
    !is.na(area_afectada_m2) &
    precipitacion_7_dias_mm > 0 &
    area_afectada_m2 > 0
)

x_exp <- datos_exponencial$precipitacion_7_dias_mm
y_exp <- datos_exponencial$area_afectada_m2


# =========================================================

3. TABLA DE PARES DE VALORES

# 3. TABLA DE PARES DE VALORES
# =========================================================

tabla_pares_exponencial <- data.frame(
  Precipitacion_7_dias_mm = x_exp,
  Area_afectada_m2 = y_exp,
  Log_area_afectada = log(y_exp)
)

head(tabla_pares_exponencial, 10)
##    Precipitacion_7_dias_mm Area_afectada_m2 Log_area_afectada
## 1                    60.21           1879.8          7.538921
## 2                   115.77           2183.0          7.688455
## 3                    47.14            784.5          6.665047
## 4                    52.52           1815.4          7.504061
## 5                    12.51           1399.4          7.243799
## 6                    84.97           2568.7          7.851155
## 7                   121.28           2725.3          7.910334
## 8                    83.39           2167.9          7.681514
## 9                    93.87           1983.9          7.592820
## 10                  105.27           1835.7          7.515181
summary(tabla_pares_exponencial)
##  Precipitacion_7_dias_mm Area_afectada_m2  Log_area_afectada
##  Min.   :  0.50          Min.   :  198.6   Min.   : 5.291   
##  1st Qu.: 38.73          1st Qu.: 1204.0   1st Qu.: 7.093   
##  Median : 62.74          Median : 1827.9   Median : 7.511   
##  Mean   : 71.91          Mean   : 2366.5   Mean   : 7.542   
##  3rd Qu.: 94.77          3rd Qu.: 2827.5   3rd Qu.: 7.947   
##  Max.   :507.07          Max.   :62703.7   Max.   :11.046
write.csv(
  tabla_pares_exponencial,
  "tabla_pares_regresion_exponencial.csv",
  row.names = FALSE,
  fileEncoding = "UTF-8"
)


# =========================================================

4. GRÁFICA: NUBE DE PUNTOS

# 4. GRÁFICA: NUBE DE PUNTOS
# =========================================================

plot(
  x_exp,
  y_exp,
  main = "Diagrama de dispersión: precipitación y área afectada",
  xlab = "Precipitación acumulada en 7 días (mm)",
  ylab = "Área afectada por deslizamiento (m²)",
  pch = 16,
  col = rgb(0.15, 0.45, 0.80, 0.25),
  cex = 0.7
)

grid()

# =========================================================

5. CONJETURA Y ESTRUCTURA MATEMÁTICA

# 5. CONJETURA Y ESTRUCTURA MATEMÁTICA
# =========================================================

# Conjetura:
# Se plantea que el área afectada puede aumentar de manera
# acelerada conforme aumenta la precipitación acumulada.

# Modelo exponencial:
# y_estimado = a * e^(b*x)
#
# Linealización:
# ln(y_estimado) = ln(a) + b*x
#
# Restricción:
# El modelo requiere valores positivos en Y,
# porque se calcula log(Y).


# =========================================================

6. CÁLCULO DE PARÁMETROS

# 6. CÁLCULO DE PARÁMETROS
# =========================================================

modelo_exponencial <- lm(
  log(area_afectada_m2) ~ precipitacion_7_dias_mm,
  data = datos_exponencial
)

summary(modelo_exponencial)
## 
## Call:
## lm(formula = log(area_afectada_m2) ~ precipitacion_7_dias_mm, 
##     data = datos_exponencial)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.78709 -0.33395 -0.00255  0.33016  2.00325 
## 
## Coefficients:
##                          Estimate Std. Error t value            Pr(>|t|)    
## (Intercept)             6.8896463  0.0086002   801.1 <0.0000000000000002 ***
## precipitacion_7_dias_mm 0.0090751  0.0001007    90.1 <0.0000000000000002 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.4871 on 11031 degrees of freedom
## Multiple R-squared:  0.4239, Adjusted R-squared:  0.4239 
## F-statistic:  8118 on 1 and 11031 DF,  p-value: < 0.00000000000000022
# Parámetros del modelo linealizado
parametros_exp <- coef(modelo_exponencial)

ln_a <- parametros_exp[1]
b_exp <- parametros_exp[2]

# Recuperar parámetro a del modelo original
a_exp <- exp(ln_a)

cat(
  "\nECUACIÓN DEL MODELO EXPONENCIAL:\n",
  "Área afectada estimada =",
  round(a_exp, 2),
  "* e^(",
  round(b_exp, 5),
  "* Precipitación acumulada en 7 días)\n"
)
## 
## ECUACIÓN DEL MODELO EXPONENCIAL:
##  Área afectada estimada = 982.05 * e^( 0.00908 * Precipitación acumulada en 7 días)
# R² del modelo linealizado
r_cuadrado_exp <- summary(modelo_exponencial)$r.squared

cat(
  "\nCoeficiente de determinación R² =",
  round(r_cuadrado_exp, 4),
  "\n"
)
## 
## Coeficiente de determinación R² = 0.4239
# =========================================================

7. SUPERPONER CURVA EXPONENCIAL

# 7. SUPERPONER CURVA EXPONENCIAL
# =========================================================

plot(
  x_exp,
  y_exp,
  main = "Regresión exponencial: precipitación y área afectada",
  xlab = "Precipitación acumulada en 7 días (mm)",
  ylab = "Área afectada por deslizamiento (m²)",
  pch = 16,
  col = rgb(0.15, 0.45, 0.80, 0.25),
  cex = 0.7
)

grid()

# Crear valores ordenados de X para dibujar la curva
x_curva <- seq(
  min(x_exp),
  max(x_exp),
  length.out = 500
)

# Calcular valores estimados por el modelo exponencial
y_curva <- a_exp * exp(b_exp * x_curva)

# Dibujar curva
lines(
  x_curva,
  y_curva,
  col = "darkgreen",
  lwd = 3
)

legend(
  "topleft",
  legend = c(
    "Eventos registrados",
    "Curva exponencial"
  ),
  col = c(
    rgb(0.15, 0.45, 0.80, 0.70),
    "darkgreen"
  ),
  pch = c(16, NA),
  lty = c(NA, 1),
  lwd = c(NA, 3),
  bty = "n"
)

mtext(
  paste0(
    "y = ",
    round(a_exp, 2),
    " · e^(",
    round(b_exp, 5),
    "x)     R² = ",
    round(r_cuadrado_exp, 3)
  ),
  side = 3,
  line = 0.2,
  cex = 0.82
)

# =========================================================

8. COVARIANZA Y PEARSON SOBRE DATOS LINEALIZADOS

# 8. COVARIANZA Y PEARSON SOBRE DATOS LINEALIZADOS
# =========================================================

# Pearson se aplica entre X y ln(Y), porque el modelo fue linealizado
log_y_exp <- log(y_exp)

covarianza_exp <- cov(x_exp, log_y_exp)

pearson_exponencial <- cor.test(
  x_exp,
  log_y_exp,
  method = "pearson"
)

r_pearson_exp <- pearson_exponencial$estimate
p_valor_exp <- pearson_exponencial$p.value

cat(
  "\nCovarianza entre X y ln(Y) =",
  round(covarianza_exp, 4),
  "\n"
)
## 
## Covarianza entre X y ln(Y) = 19.2428
cat(
  "Pearson entre X y ln(Y): r =",
  round(r_pearson_exp, 3),
  "\n"
)
## Pearson entre X y ln(Y): r = 0.651
cat(
  "p-value =",
  format.pval(p_valor_exp, digits = 4),
  "\n"
)
## p-value = < 0.00000000000000022
pearson_exponencial
## 
##  Pearson's product-moment correlation
## 
## data:  x_exp and log_y_exp
## t = 90.101, df = 11031, p-value < 0.00000000000000022
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.6402295 0.6617310
## sample estimates:
##       cor 
## 0.6511109
# =========================================================

8.1. RESTRICCIONES DEL MODELO

# 8.1 RESTRICCIONES DEL MODELO
# =========================================================

min_precipitacion_exp <- min(x_exp)
max_precipitacion_exp <- max(x_exp)

cat(
  "\nRango válido de precipitación observado:\n",
  round(min_precipitacion_exp, 2),
  "a",
  round(max_precipitacion_exp, 2),
  "mm.\n"
)
## 
## Rango válido de precipitación observado:
##  0.5 a 507.07 mm.
cat(
  "La variable área afectada debe ser mayor que cero.\n",
  "No se recomienda extrapolar fuera del rango observado.\n"
)
## La variable área afectada debe ser mayor que cero.
##  No se recomienda extrapolar fuera del rango observado.
# =========================================================

9. ESTIMACIÓN

# 9. ESTIMACIÓN
# =========================================================

valor_estimado_exp <- 150

if (
  valor_estimado_exp < min_precipitacion_exp ||
  valor_estimado_exp > max_precipitacion_exp
) {
  
  cat(
    "\nADVERTENCIA: el valor está fuera del rango observado.\n"
  )
  
} else {
  
  area_estimada_exp <- a_exp * exp(
    b_exp * valor_estimado_exp
  )
  
  cat(
    "\nCon",
    valor_estimado_exp,
    "mm de precipitación acumulada en 7 días,\n",
    "el modelo exponencial estima un área afectada de",
    round(area_estimada_exp, 2),
    "m².\n"
  )
}
## 
## Con 150 mm de precipitación acumulada en 7 días,
##  el modelo exponencial estima un área afectada de 3831.1 m².
# =========================================================

10. CONCLUSIÓN

# 10. CONCLUSIÓN
# =========================================================

cat(
  "\n=============================================\n",
  "CONCLUSIÓN DEL MODELO EXPONENCIAL\n",
  "=============================================\n"
)
## 
## =============================================
##  CONCLUSIÓN DEL MODELO EXPONENCIAL
##  =============================================
cat(
  "El modelo exponencial relaciona la precipitación acumulada\n",
  "con el área afectada mediante una función creciente.\n"
)
## El modelo exponencial relaciona la precipitación acumulada
##  con el área afectada mediante una función creciente.
cat(
  "La correlación de Pearson calculada entre X y ln(Y) fue de r =",
  round(r_pearson_exp, 3),
  "con p-value",
  format.pval(p_valor_exp, digits = 4),
  ".\n"
)
## La correlación de Pearson calculada entre X y ln(Y) fue de r = 0.651 con p-value < 0.00000000000000022 .
cat(
  "El modelo linealizado explica aproximadamente",
  round(r_cuadrado_exp * 100, 2),
  "% de la variabilidad de ln(área afectada).\n"
)
## El modelo linealizado explica aproximadamente 42.39 % de la variabilidad de ln(área afectada).
cat(
  "La estimación debe interpretarse como aproximada y aplicarse\n",
  "solamente dentro del rango de precipitación observado.\n"
)
## La estimación debe interpretarse como aproximada y aplicarse
##  solamente dentro del rango de precipitación observado.
# =========================================================

MODELO 3: REGRESIÓN POTENCIAL

# MODELO 3: REGRESIÓN POTENCIAL
# X = Precipitación acumulada en 7 días
# Y = Área afectada por deslizamientos
# =========================================================


# =========================================================

1. LIBRERÍAS Y DATOS

# 1. LIBRERÍAS Y DATOS
# =========================================================

# Se reutiliza el dataset ya cargado: datos
# No se requieren librerías adicionales.


# =========================================================

2. SELECCIÓN DE VARIABLES

# 2. SELECCIÓN DE VARIABLES
# =========================================================

x_pot <- datos$precipitation_7d_mm_synthetic
y_pot <- datos$area_affected_m2_synthetic

datos_potencial <- data.frame(
  precipitacion_7_dias_mm = x_pot,
  area_afectada_m2 = y_pot
)

# Para modelo potencial se requiere X > 0 y Y > 0
datos_potencial <- subset(
  datos_potencial,
  !is.na(precipitacion_7_dias_mm) &
    !is.na(area_afectada_m2) &
    precipitacion_7_dias_mm > 0 &
    area_afectada_m2 > 0
)

x_pot <- datos_potencial$precipitacion_7_dias_mm
y_pot <- datos_potencial$area_afectada_m2


# =========================================================

3. TABLA DE PARES DE VALORES

# 3. TABLA DE PARES DE VALORES
# =========================================================

tabla_pares_potencial <- data.frame(
  Precipitacion_7_dias_mm = x_pot,
  Area_afectada_m2 = y_pot,
  Log_X = log(x_pot),
  Log_Y = log(y_pot)
)

head(tabla_pares_potencial, 10)
##    Precipitacion_7_dias_mm Area_afectada_m2    Log_X    Log_Y
## 1                    60.21           1879.8 4.097838 7.538921
## 2                   115.77           2183.0 4.751605 7.688455
## 3                    47.14            784.5 3.853122 6.665047
## 4                    52.52           1815.4 3.961194 7.504061
## 5                    12.51           1399.4 2.526528 7.243799
## 6                    84.97           2568.7 4.442298 7.851155
## 7                   121.28           2725.3 4.798102 7.910334
## 8                    83.39           2167.9 4.423528 7.681514
## 9                    93.87           1983.9 4.541911 7.592820
## 10                  105.27           1835.7 4.656528 7.515181
summary(tabla_pares_potencial)
##  Precipitacion_7_dias_mm Area_afectada_m2      Log_X             Log_Y       
##  Min.   :  0.50          Min.   :  198.6   Min.   :-0.6931   Min.   : 5.291  
##  1st Qu.: 38.73          1st Qu.: 1204.0   1st Qu.: 3.6566   1st Qu.: 7.093  
##  Median : 62.74          Median : 1827.9   Median : 4.1390   Median : 7.511  
##  Mean   : 71.91          Mean   : 2366.5   Mean   : 4.0495   Mean   : 7.542  
##  3rd Qu.: 94.77          3rd Qu.: 2827.5   3rd Qu.: 4.5515   3rd Qu.: 7.947  
##  Max.   :507.07          Max.   :62703.7   Max.   : 6.2286   Max.   :11.046
write.csv(
  tabla_pares_potencial,
  "tabla_pares_regresion_potencial.csv",
  row.names = FALSE,
  fileEncoding = "UTF-8"
)


# =========================================================

4. GRÁFICA: NUBE DE PUNTOS / DIAGRAMA DE DISPERSIÓN

# 4. GRÁFICA: NUBE DE PUNTOS / DIAGRAMA DE DISPERSIÓN
# =========================================================

plot(
  x_pot,
  y_pot,
  main = "Diagrama de dispersión: precipitación y área afectada",
  xlab = "Precipitación acumulada en 7 días (mm)",
  ylab = "Área afectada por deslizamiento (m²)",
  pch = 16,
  col = rgb(0.10, 0.40, 0.80, 0.25),
  cex = 0.7
)

grid()

# =========================================================

5. CONJETURA Y ESTRUCTURA MATEMÁTICA

# 5. CONJETURA Y ESTRUCTURA MATEMÁTICA
# =========================================================

# Conjetura:
# Se plantea que el área afectada puede relacionarse con la
# precipitación mediante una función potencial.

# Modelo potencial:
# y_estimado = a * x^b
#
# Linealización:
# ln(y_estimado) = ln(a) + b*ln(x)
#
# Restricciones:
# x > 0
# y > 0


# =========================================================

6. CÁLCULO DE PARÁMETROS

# 6. CÁLCULO DE PARÁMETROS
# =========================================================

modelo_potencial <- lm(
  log(area_afectada_m2) ~ log(precipitacion_7_dias_mm),
  data = datos_potencial
)

summary(modelo_potencial)
## 
## Call:
## lm(formula = log(area_afectada_m2) ~ log(precipitacion_7_dias_mm), 
##     data = datos_potencial)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.89312 -0.36552 -0.01363  0.33898  2.71750 
## 
## Coefficients:
##                              Estimate Std. Error t value            Pr(>|t|)
## (Intercept)                  5.554409   0.027531  201.75 <0.0000000000000002
## log(precipitacion_7_dias_mm) 0.490880   0.006685   73.43 <0.0000000000000002
##                                 
## (Intercept)                  ***
## log(precipitacion_7_dias_mm) ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.526 on 11031 degrees of freedom
## Multiple R-squared:  0.3283, Adjusted R-squared:  0.3282 
## F-statistic:  5392 on 1 and 11031 DF,  p-value: < 0.00000000000000022
# Extraer parámetros del modelo linealizado
parametros_pot <- coef(modelo_potencial)

ln_a_pot <- parametros_pot[1]
b_pot <- parametros_pot[2]

# Recuperar parámetro a del modelo original
a_pot <- exp(ln_a_pot)

cat(
  "\nECUACIÓN DEL MODELO POTENCIAL:\n",
  "Área afectada estimada =",
  round(a_pot, 4),
  "* (Precipitación acumulada en 7 días)^",
  round(b_pot, 4),
  "\n"
)
## 
## ECUACIÓN DEL MODELO POTENCIAL:
##  Área afectada estimada = 258.3743 * (Precipitación acumulada en 7 días)^ 0.4909
# R² del modelo linealizado
r_cuadrado_pot <- summary(modelo_potencial)$r.squared

cat(
  "\nCoeficiente de determinación R² =",
  round(r_cuadrado_pot, 4),
  "\n"
)
## 
## Coeficiente de determinación R² = 0.3283
# =========================================================

7. SUPERPONER CURVA POTENCIAL

# 7. SUPERPONER CURVA POTENCIAL
# =========================================================

plot(
  x_pot,
  y_pot,
  main = "Regresión potencial: precipitación y área afectada",
  xlab = "Precipitación acumulada en 7 días (mm)",
  ylab = "Área afectada por deslizamiento (m²)",
  pch = 16,
  col = rgb(0.10, 0.40, 0.80, 0.25),
  cex = 0.7
)

grid()

x_curva_pot <- seq(
  min(x_pot),
  max(x_pot),
  length.out = 500
)

y_curva_pot <- a_pot * (x_curva_pot ^ b_pot)

lines(
  x_curva_pot,
  y_curva_pot,
  col = "purple",
  lwd = 3
)

legend(
  "topleft",
  legend = c(
    "Eventos registrados",
    "Curva potencial"
  ),
  col = c(
    rgb(0.10, 0.40, 0.80, 0.70),
    "purple"
  ),
  pch = c(16, NA),
  lty = c(NA, 1),
  lwd = c(NA, 3),
  bty = "n"
)

mtext(
  paste0(
    "y = ",
    round(a_pot, 2),
    "·x^",
    round(b_pot, 4),
    "     R² = ",
    round(r_cuadrado_pot, 3)
  ),
  side = 3,
  line = 0.2,
  cex = 0.82
)

# =========================================================

8. COVARIANZA Y TEST DE PEARSON

# 8. COVARIANZA Y TEST DE PEARSON
# =========================================================

# Pearson se calcula sobre la forma linealizada:
# ln(X) y ln(Y)

log_x_pot <- log(x_pot)
log_y_pot <- log(y_pot)

covarianza_pot <- cov(log_x_pot, log_y_pot)

pearson_potencial <- cor.test(
  log_x_pot,
  log_y_pot,
  method = "pearson"
)

pearson_potencial
## 
##  Pearson's product-moment correlation
## 
## data:  log_x_pot and log_y_pot
## t = 73.428, df = 11031, p-value < 0.00000000000000022
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.5603122 0.5853825
## sample estimates:
##       cor 
## 0.5729814
r_pearson_pot <- pearson_potencial$estimate
p_valor_pot <- pearson_potencial$p.value

cat(
  "\nCovarianza entre ln(X) y ln(Y) =",
  round(covarianza_pot, 4),
  "\n"
)
## 
## Covarianza entre ln(X) y ln(Y) = 0.2755
cat(
  "Coeficiente de Pearson r =",
  round(r_pearson_pot, 3),
  "\n"
)
## Coeficiente de Pearson r = 0.573
cat(
  "p-value =",
  format.pval(p_valor_pot, digits = 4),
  "\n"
)
## p-value = < 0.00000000000000022
# =========================================================

8.1. RESTRICCIONES DEL MODELO

# 8.1 RESTRICCIONES DEL MODELO
# =========================================================

min_x_pot <- min(x_pot)
max_x_pot <- max(x_pot)

cat(
  "\nRango válido de precipitación observado:\n",
  round(min_x_pot, 2),
  "a",
  round(max_x_pot, 2),
  "mm.\n"
)
## 
## Rango válido de precipitación observado:
##  0.5 a 507.07 mm.
cat(
  "El modelo potencial requiere valores positivos en X y Y.\n",
  "No se recomienda extrapolar fuera del rango observado.\n"
)
## El modelo potencial requiere valores positivos en X y Y.
##  No se recomienda extrapolar fuera del rango observado.
# =========================================================

9. ESTIMACIÓN

# 9. ESTIMACIÓN
# =========================================================

valor_estimado_pot <- 150

if (
  valor_estimado_pot < min_x_pot ||
  valor_estimado_pot > max_x_pot
) {
  
  cat(
    "\nADVERTENCIA: el valor está fuera del rango observado.\n"
  )
  
} else {
  
  area_estimada_pot <- a_pot * (valor_estimado_pot ^ b_pot)
  
  cat(
    "\nCon",
    valor_estimado_pot,
    "mm de precipitación acumulada en 7 días,\n",
    "el modelo potencial estima un área afectada de",
    round(area_estimada_pot, 2),
    "m².\n"
  )
}
## 
## Con 150 mm de precipitación acumulada en 7 días,
##  el modelo potencial estima un área afectada de 3023.07 m².
# =========================================================

10. CONCLUSIÓN

# 10. CONCLUSIÓN
# =========================================================

cat(
  "\n=============================================\n",
  "CONCLUSIÓN DEL MODELO POTENCIAL\n",
  "=============================================\n"
)
## 
## =============================================
##  CONCLUSIÓN DEL MODELO POTENCIAL
##  =============================================
cat(
  "El modelo potencial relaciona la precipitación acumulada\n",
  "con el área afectada mediante una función del tipo y = a*x^b.\n"
)
## El modelo potencial relaciona la precipitación acumulada
##  con el área afectada mediante una función del tipo y = a*x^b.
cat(
  "La correlación de Pearson calculada entre ln(X) y ln(Y) fue de r =",
  round(r_pearson_pot, 3),
  "con p-value",
  format.pval(p_valor_pot, digits = 4),
  ".\n"
)
## La correlación de Pearson calculada entre ln(X) y ln(Y) fue de r = 0.573 con p-value < 0.00000000000000022 .
cat(
  "El modelo linealizado explica aproximadamente",
  round(r_cuadrado_pot * 100, 2),
  "% de la variabilidad observada en ln(Y).\n"
)
## El modelo linealizado explica aproximadamente 32.83 % de la variabilidad observada en ln(Y).
cat(
  "Este modelo puede ser útil para describir relaciones no lineales\n",
  "cuando el crecimiento de Y depende proporcionalmente de una potencia de X.\n"
)
## Este modelo puede ser útil para describir relaciones no lineales
##  cuando el crecimiento de Y depende proporcionalmente de una potencia de X.
cat(
  "La estimación debe interpretarse con cautela y dentro del rango observado.\n"
)
## La estimación debe interpretarse con cautela y dentro del rango observado.
# =========================================================

MODELO 4: REGRESIÓN LOGARÍTMICA

# MODELO 4: REGRESIÓN LOGARÍTMICA
# X = Precipitación acumulada en 7 días
# Y = Área afectada por deslizamientos
# =========================================================


# =========================================================

1. LIBRERÍAS Y DATOS

# 1. LIBRERÍAS Y DATOS
# =========================================================

# Se reutiliza el dataset ya cargado: datos
# No se requieren librerías adicionales.


# =========================================================

2. SELECCIÓN DE VARIABLES

# 2. SELECCIÓN DE VARIABLES
# =========================================================

x_log <- datos$precipitation_7d_mm_synthetic
y_log <- datos$area_affected_m2_synthetic

datos_logaritmico <- data.frame(
  precipitacion_7_dias_mm = x_log,
  area_afectada_m2 = y_log
)

# Restricción del modelo logarítmico:
# X debe ser mayor que cero, porque se aplica ln(X).
datos_logaritmico <- subset(
  datos_logaritmico,
  !is.na(precipitacion_7_dias_mm) &
    !is.na(area_afectada_m2) &
    precipitacion_7_dias_mm > 0
)

# Actualizar variables depuradas
x_log <- datos_logaritmico$precipitacion_7_dias_mm
y_log <- datos_logaritmico$area_afectada_m2

# Variable transformada
ln_x_log <- log(x_log)


# =========================================================

3. TABLA DE PARES DE VALORES

# 3. TABLA DE PARES DE VALORES
# =========================================================

tabla_pares_logaritmico <- data.frame(
  Precipitacion_7_dias_mm = x_log,
  Ln_precipitacion = ln_x_log,
  Area_afectada_m2 = y_log
)

head(tabla_pares_logaritmico, 10)
##    Precipitacion_7_dias_mm Ln_precipitacion Area_afectada_m2
## 1                    60.21         4.097838           1879.8
## 2                   115.77         4.751605           2183.0
## 3                    47.14         3.853122            784.5
## 4                    52.52         3.961194           1815.4
## 5                    12.51         2.526528           1399.4
## 6                    84.97         4.442298           2568.7
## 7                   121.28         4.798102           2725.3
## 8                    83.39         4.423528           2167.9
## 9                    93.87         4.541911           1983.9
## 10                  105.27         4.656528           1835.7
summary(tabla_pares_logaritmico)
##  Precipitacion_7_dias_mm Ln_precipitacion  Area_afectada_m2 
##  Min.   :  0.50          Min.   :-0.6931   Min.   :  198.6  
##  1st Qu.: 38.73          1st Qu.: 3.6566   1st Qu.: 1204.0  
##  Median : 62.74          Median : 4.1390   Median : 1827.9  
##  Mean   : 71.91          Mean   : 4.0495   Mean   : 2366.5  
##  3rd Qu.: 94.77          3rd Qu.: 4.5515   3rd Qu.: 2827.5  
##  Max.   :507.07          Max.   : 6.2286   Max.   :62703.7
write.csv(
  tabla_pares_logaritmico,
  "tabla_pares_regresion_logaritmica.csv",
  row.names = FALSE,
  fileEncoding = "UTF-8"
)


# =========================================================

4. GRÁFICA: NUBE DE PUNTOS

# 4. GRÁFICA: NUBE DE PUNTOS
# =========================================================

plot(
  x_log,
  y_log,
  main = "Diagrama de dispersión: precipitación y área afectada",
  xlab = "Precipitación acumulada en 7 días (mm)",
  ylab = "Área afectada por deslizamiento (m²)",
  pch = 16,
  col = rgb(0.12, 0.34, 0.72, 0.25),
  cex = 0.7
)

grid()

# =========================================================

5. CONJETURA Y ESTRUCTURA MATEMÁTICA

# 5. CONJETURA Y ESTRUCTURA MATEMÁTICA
# =========================================================

# Conjetura:
# Se propone un modelo logarítmico si el área afectada aumenta
# rápidamente al inicio y luego el crecimiento se vuelve más gradual.

# Estructura matemática:
# y_estimado = a + b * ln(x)
#
# Donde:
# y_estimado = área afectada estimada en m²
# x = precipitación acumulada en 7 días
# a = intercepto
# b = cambio esperado en Y por cambio logarítmico de X
#
# Restricción:
# x debe ser mayor que cero.


# =========================================================

6. CÁLCULO DE PARÁMETROS

# 6. CÁLCULO DE PARÁMETROS
# =========================================================

modelo_logaritmico <- lm(
  area_afectada_m2 ~ log(precipitacion_7_dias_mm),
  data = datos_logaritmico
)

summary(modelo_logaritmico)
## 
## Call:
## lm(formula = area_afectada_m2 ~ log(precipitacion_7_dias_mm), 
##     data = datos_logaritmico)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
##  -2981  -1005   -342    506  58188 
## 
## Coefficients:
##                              Estimate Std. Error t value            Pr(>|t|)
## (Intercept)                  -3065.33      98.65  -31.07 <0.0000000000000002
## log(precipitacion_7_dias_mm)  1341.36      23.96   55.99 <0.0000000000000002
##                                 
## (Intercept)                  ***
## log(precipitacion_7_dias_mm) ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1885 on 11031 degrees of freedom
## Multiple R-squared:  0.2213, Adjusted R-squared:  0.2212 
## F-statistic:  3135 on 1 and 11031 DF,  p-value: < 0.00000000000000022
# Extraer parámetros
parametros_log <- coef(modelo_logaritmico)

intercepto_log <- parametros_log[1]
pendiente_log <- parametros_log[2]

# Coeficiente de determinación
r_cuadrado_log <- summary(modelo_logaritmico)$r.squared

cat(
  "\nECUACIÓN DEL MODELO LOGARÍTMICO:\n",
  "Área afectada estimada =",
  round(intercepto_log, 2),
  "+",
  round(pendiente_log, 2),
  "* ln(Precipitación acumulada en 7 días)\n"
)
## 
## ECUACIÓN DEL MODELO LOGARÍTMICO:
##  Área afectada estimada = -3065.33 + 1341.36 * ln(Precipitación acumulada en 7 días)
cat(
  "\nCoeficiente de determinación R² =",
  round(r_cuadrado_log, 4),
  "\n"
)
## 
## Coeficiente de determinación R² = 0.2213
# =========================================================

7. SUPERPONER CURVA LOGARÍTMICA

# 7. SUPERPONER CURVA LOGARÍTMICA
# =========================================================

plot(
  x_log,
  y_log,
  main = "Regresión logarítmica: precipitación y área afectada",
  xlab = "Precipitación acumulada en 7 días (mm)",
  ylab = "Área afectada por deslizamiento (m²)",
  pch = 16,
  col = rgb(0.12, 0.34, 0.72, 0.25),
  cex = 0.7
)

grid()

# Valores ordenados de X para la curva
x_curva_log <- seq(
  min(x_log),
  max(x_log),
  length.out = 500
)

# Valores estimados
y_curva_log <- intercepto_log + pendiente_log * log(x_curva_log)

# Dibujar curva
lines(
  x_curva_log,
  y_curva_log,
  col = "orange",
  lwd = 3
)

legend(
  "topleft",
  legend = c(
    "Eventos registrados",
    "Curva logarítmica"
  ),
  col = c(
    rgb(0.12, 0.34, 0.72, 0.70),
    "orange"
  ),
  pch = c(16, NA),
  lty = c(NA, 1),
  lwd = c(NA, 3),
  bty = "n"
)

mtext(
  paste0(
    "y = ",
    round(intercepto_log, 2),
    " + ",
    round(pendiente_log, 2),
    " ln(x)     R² = ",
    round(r_cuadrado_log, 3)
  ),
  side = 3,
  line = 0.2,
  cex = 0.82
)

# =========================================================

8. COVARIANZA Y TEST DE PEARSON

# 8. COVARIANZA Y TEST DE PEARSON
# =========================================================

# Para este modelo, la relación lineal se evalúa entre ln(X) y Y.
covarianza_log <- cov(ln_x_log, y_log)

pearson_logaritmico <- cor.test(
  ln_x_log,
  y_log,
  method = "pearson"
)

pearson_logaritmico
## 
##  Pearson's product-moment correlation
## 
## data:  ln_x_log and y_log
## t = 55.993, df = 11031, p-value < 0.00000000000000022
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.4557840 0.4848466
## sample estimates:
##       cor 
## 0.4704429
r_pearson_log <- pearson_logaritmico$estimate
p_valor_log <- pearson_logaritmico$p.value

cat(
  "\nCovarianza entre ln(X) y Y =",
  round(covarianza_log, 2),
  "\n"
)
## 
## Covarianza entre ln(X) y Y = 752.81
cat(
  "Coeficiente de Pearson r =",
  round(r_pearson_log, 3),
  "\n"
)
## Coeficiente de Pearson r = 0.47
cat(
  "p-value =",
  format.pval(p_valor_log, digits = 4),
  "\n"
)
## p-value = < 0.00000000000000022
# =========================================================

8.1. RESTRICCIONES DEL MODELO

# 8.1 RESTRICCIONES DEL MODELO
# =========================================================

min_precipitacion_log <- min(x_log)
max_precipitacion_log <- max(x_log)

cat(
  "\nRango válido de precipitación observado:\n",
  round(min_precipitacion_log, 2),
  "a",
  round(max_precipitacion_log, 2),
  "mm.\n"
)
## 
## Rango válido de precipitación observado:
##  0.5 a 507.07 mm.
cat(
  "El modelo requiere valores positivos de precipitación.\n",
  "No se recomienda estimar fuera del rango observado.\n"
)
## El modelo requiere valores positivos de precipitación.
##  No se recomienda estimar fuera del rango observado.
# =========================================================

9. ESTIMACIÓN

# 9. ESTIMACIÓN
# =========================================================

valor_estimado_log <- 150

if (
  valor_estimado_log < min_precipitacion_log ||
  valor_estimado_log > max_precipitacion_log
) {
  
  cat(
    "\nADVERTENCIA: el valor está fuera del rango observado.\n"
  )
  
} else {
  
  area_estimada_log <- intercepto_log +
    pendiente_log * log(valor_estimado_log)
  
  cat(
    "\nCon",
    valor_estimado_log,
    "mm de precipitación acumulada en 7 días,\n",
    "el modelo logarítmico estima un área afectada de",
    round(area_estimada_log, 2),
    "m².\n"
  )
}
## 
## Con 150 mm de precipitación acumulada en 7 días,
##  el modelo logarítmico estima un área afectada de 3655.75 m².
# =========================================================

10. CONCLUSIÓN

# 10. CONCLUSIÓN
# =========================================================

cat(
  "\n=============================================\n",
  "CONCLUSIÓN DEL MODELO LOGARÍTMICO\n",
  "=============================================\n"
)
## 
## =============================================
##  CONCLUSIÓN DEL MODELO LOGARÍTMICO
##  =============================================
cat(
  "El modelo logarítmico describe la relación entre la precipitación\n",
  "acumulada y el área afectada mediante una función y = a + b ln(x).\n"
)
## El modelo logarítmico describe la relación entre la precipitación
##  acumulada y el área afectada mediante una función y = a + b ln(x).
cat(
  "La correlación de Pearson entre ln(X) y Y fue r =",
  round(r_pearson_log, 3),
  "con un p-value de",
  format.pval(p_valor_log, digits = 4),
  ".\n"
)
## La correlación de Pearson entre ln(X) y Y fue r = 0.47 con un p-value de < 0.00000000000000022 .
cat(
  "El modelo explica aproximadamente",
  round(r_cuadrado_log * 100, 2),
  "% de la variabilidad observada en el área afectada.\n"
)
## El modelo explica aproximadamente 22.13 % de la variabilidad observada en el área afectada.
cat(
  "La estimación debe interpretarse como aproximada y aplicarse\n",
  "únicamente dentro del rango de precipitación registrado.\n"
)
## La estimación debe interpretarse como aproximada y aplicarse
##  únicamente dentro del rango de precipitación registrado.
# =========================================================

MODELO 5: REGRESIÓN POLINÓMICA CUADRÁTICA

# MODELO 5: REGRESIÓN POLINÓMICA CUADRÁTICA
# X = Precipitación acumulada en 7 días
# Y = Área afectada por deslizamientos
# =========================================================


# =========================================================

1. LIBRERÍAS Y DATOS

# 1. LIBRERÍAS Y DATOS
# =========================================================

# Se reutiliza el dataset ya cargado: datos
# No se requieren librerías adicionales.


# =========================================================

2. SELECCIÓN DE VARIABLES

# 2. SELECCIÓN DE VARIABLES
# =========================================================

x_pol <- datos$precipitation_7d_mm_synthetic
y_pol <- datos$area_affected_m2_synthetic

datos_polinomico <- data.frame(
  precipitacion_7_dias_mm = x_pol,
  area_afectada_m2 = y_pol
)

# Eliminar valores faltantes por seguridad
datos_polinomico <- na.omit(datos_polinomico)

# Actualizar X y Y
x_pol <- datos_polinomico$precipitacion_7_dias_mm
y_pol <- datos_polinomico$area_afectada_m2

# Crear término cuadrático
x2_pol <- x_pol^2


# =========================================================

3. TABLA DE PARES DE VALORES

# 3. TABLA DE PARES DE VALORES
# =========================================================

tabla_pares_polinomico <- data.frame(
  Precipitacion_7_dias_mm = x_pol,
  Precipitacion_cuadrado = x2_pol,
  Area_afectada_m2 = y_pol
)

head(tabla_pares_polinomico, 10)
##    Precipitacion_7_dias_mm Precipitacion_cuadrado Area_afectada_m2
## 1                    60.21              3625.2441           1879.8
## 2                   115.77             13402.6929           2183.0
## 3                    47.14              2222.1796            784.5
## 4                    52.52              2758.3504           1815.4
## 5                    12.51               156.5001           1399.4
## 6                    84.97              7219.9009           2568.7
## 7                   121.28             14708.8384           2725.3
## 8                    83.39              6953.8921           2167.9
## 9                    93.87              8811.5769           1983.9
## 10                  105.27             11081.7729           1835.7
summary(tabla_pares_polinomico)
##  Precipitacion_7_dias_mm Precipitacion_cuadrado Area_afectada_m2 
##  Min.   :  0.50          Min.   :     0.25      Min.   :  198.6  
##  1st Qu.: 38.73          1st Qu.:  1500.01      1st Qu.: 1204.0  
##  Median : 62.74          Median :  3936.31      Median : 1827.9  
##  Mean   : 71.91          Mean   :  7290.89      Mean   : 2366.5  
##  3rd Qu.: 94.77          3rd Qu.:  8981.35      3rd Qu.: 2827.5  
##  Max.   :507.07          Max.   :257119.98      Max.   :62703.7
write.csv(
  tabla_pares_polinomico,
  "tabla_pares_regresion_polinomica.csv",
  row.names = FALSE,
  fileEncoding = "UTF-8"
)


# =========================================================

4. GRÁFICA: NUBE DE PUNTOS

# 4. GRÁFICA: NUBE DE PUNTOS
# =========================================================

plot(
  x_pol,
  y_pol,
  main = "Diagrama de dispersión: precipitación y área afectada",
  xlab = "Precipitación acumulada en 7 días (mm)",
  ylab = "Área afectada por deslizamiento (m²)",
  pch = 16,
  col = rgb(0.12, 0.34, 0.72, 0.25),
  cex = 0.7
)

grid()

# =========================================================

5. CONJETURA Y ESTRUCTURA MATEMÁTICA

# 5. CONJETURA Y ESTRUCTURA MATEMÁTICA
# =========================================================

# Conjetura:
# Se propone un modelo polinómico cuadrático debido a que
# la relación entre precipitación y área afectada puede presentar
# curvatura y no seguir una recta perfecta.

# Estructura matemática:
# y_estimado = a + b*x + c*x^2
#
# Donde:
# y_estimado = área afectada estimada en m²
# x = precipitación acumulada en 7 días
# a = intercepto
# b = coeficiente lineal
# c = coeficiente cuadrático


# =========================================================

6. CÁLCULO DE PARÁMETROS DEL MODELO

# 6. CÁLCULO DE PARÁMETROS DEL MODELO
# =========================================================

modelo_polinomico <- lm(
  area_afectada_m2 ~ precipitacion_7_dias_mm +
    I(precipitacion_7_dias_mm^2),
  data = datos_polinomico
)

summary(modelo_polinomico)
## 
## Call:
## lm(formula = area_afectada_m2 ~ precipitacion_7_dias_mm + I(precipitacion_7_dias_mm^2), 
##     data = datos_polinomico)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
##  -8169   -724   -229    490  48678 
## 
## Coefficients:
##                                 Estimate  Std. Error t value
## (Intercept)                  1557.156325   37.935665  41.047
## precipitacion_7_dias_mm        -6.734240    0.811281  -8.301
## I(precipitacion_7_dias_mm^2)    0.177422    0.003645  48.675
##                                         Pr(>|t|)    
## (Intercept)                  <0.0000000000000002 ***
## precipitacion_7_dias_mm      <0.0000000000000002 ***
## I(precipitacion_7_dias_mm^2) <0.0000000000000002 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1485 on 11030 degrees of freedom
## Multiple R-squared:  0.517,  Adjusted R-squared:  0.5169 
## F-statistic:  5902 on 2 and 11030 DF,  p-value: < 0.00000000000000022
# Extraer parámetros
parametros_pol <- coef(modelo_polinomico)

intercepto_pol <- parametros_pol[1]
coef_lineal_pol <- parametros_pol[2]
coef_cuadratico_pol <- parametros_pol[3]

# Coeficiente de determinación
r_cuadrado_pol <- summary(modelo_polinomico)$r.squared

cat(
  "\nECUACIÓN DEL MODELO POLINÓMICO:\n",
  "Área afectada estimada =",
  round(intercepto_pol, 2),
  "+",
  round(coef_lineal_pol, 2),
  "* x +",
  round(coef_cuadratico_pol, 5),
  "* x²\n"
)
## 
## ECUACIÓN DEL MODELO POLINÓMICO:
##  Área afectada estimada = 1557.16 + -6.73 * x + 0.17742 * x²
cat(
  "\nCoeficiente de determinación R² =",
  round(r_cuadrado_pol, 4),
  "\n"
)
## 
## Coeficiente de determinación R² = 0.517
# =========================================================

7. SUPERPONER CURVA POLINÓMICA

# 7. SUPERPONER CURVA POLINÓMICA
# =========================================================

plot(
  x_pol,
  y_pol,
  main = "Regresión polinómica: precipitación y área afectada",
  xlab = "Precipitación acumulada en 7 días (mm)",
  ylab = "Área afectada por deslizamiento (m²)",
  pch = 16,
  col = rgb(0.12, 0.34, 0.72, 0.25),
  cex = 0.7
)

grid()

# Crear valores ordenados para dibujar la curva
x_curva_pol <- seq(
  min(x_pol),
  max(x_pol),
  length.out = 500
)

# Calcular estimaciones según la ecuación polinómica
y_curva_pol <- intercepto_pol +
  coef_lineal_pol * x_curva_pol +
  coef_cuadratico_pol * x_curva_pol^2

# Dibujar curva polinómica
lines(
  x_curva_pol,
  y_curva_pol,
  col = "darkorange3",
  lwd = 3
)

legend(
  "topleft",
  legend = c(
    "Eventos registrados",
    "Curva polinómica"
  ),
  col = c(
    rgb(0.12, 0.34, 0.72, 0.70),
    "darkorange3"
  ),
  pch = c(16, NA),
  lty = c(NA, 1),
  lwd = c(NA, 3),
  bty = "n"
)

mtext(
  paste0(
    "y = ",
    round(intercepto_pol, 2),
    " + ",
    round(coef_lineal_pol, 2),
    "x + ",
    round(coef_cuadratico_pol, 5),
    "x²     R² = ",
    round(r_cuadrado_pol, 3)
  ),
  side = 3,
  line = 0.2,
  cex = 0.78
)

# =========================================================

8. COVARIANZA Y TEST DE PEARSON

# 8. COVARIANZA Y TEST DE PEARSON
# =========================================================

# Pearson se calcula entre X y Y originales.
# Sirve para medir la parte lineal de la relación.

covarianza_pol <- cov(x_pol, y_pol)

pearson_polinomico <- cor.test(
  x_pol,
  y_pol,
  method = "pearson"
)

pearson_polinomico
## 
##  Pearson's product-moment correlation
## 
## data:  x_pol and y_pol
## t = 88.136, df = 11031, p-value < 0.00000000000000022
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.6317331 0.6536351
## sample estimates:
##       cor 
## 0.6428155
r_pearson_pol <- pearson_polinomico$estimate
p_valor_pol <- pearson_polinomico$p.value

cat(
  "\nCovarianza entre X y Y =",
  round(covarianza_pol, 2),
  "\n"
)
## 
## Covarianza entre X y Y = 63227.27
cat(
  "Coeficiente de Pearson r =",
  round(r_pearson_pol, 3),
  "\n"
)
## Coeficiente de Pearson r = 0.643
cat(
  "p-value =",
  format.pval(p_valor_pol, digits = 4),
  "\n"
)
## p-value = < 0.00000000000000022
# =========================================================

8.1. RESTRICCIONES DEL MODELO

# 8.1 RESTRICCIONES DEL MODELO
# =========================================================

min_precipitacion_pol <- min(x_pol)
max_precipitacion_pol <- max(x_pol)

cat(
  "\nRango válido de precipitación observado:\n",
  round(min_precipitacion_pol, 2),
  "a",
  round(max_precipitacion_pol, 2),
  "mm.\n"
)
## 
## Rango válido de precipitación observado:
##  0.5 a 507.07 mm.
cat(
  "No se recomienda extrapolar fuera del rango observado,\n",
  "porque las curvas polinómicas pueden crecer o disminuir\n",
  "rápidamente en valores extremos.\n"
)
## No se recomienda extrapolar fuera del rango observado,
##  porque las curvas polinómicas pueden crecer o disminuir
##  rápidamente en valores extremos.
# =========================================================

9. ESTIMACIÓN

# 9. ESTIMACIÓN
# =========================================================

valor_estimado_pol <- 150

if (
  valor_estimado_pol < min_precipitacion_pol ||
  valor_estimado_pol > max_precipitacion_pol
) {
  
  cat(
    "\nADVERTENCIA: el valor está fuera del rango observado.\n"
  )
  
} else {
  
  area_estimada_pol <- intercepto_pol +
    coef_lineal_pol * valor_estimado_pol +
    coef_cuadratico_pol * valor_estimado_pol^2
  
  cat(
    "\nCon",
    valor_estimado_pol,
    "mm de precipitación acumulada en 7 días,\n",
    "el modelo polinómico estima un área afectada de",
    round(area_estimada_pol, 2),
    "m².\n"
  )
}
## 
## Con 150 mm de precipitación acumulada en 7 días,
##  el modelo polinómico estima un área afectada de 4539.02 m².
# =========================================================

10. CONCLUSIÓN

# 10. CONCLUSIÓN
# =========================================================

cat(
  "\n=============================================\n",
  "CONCLUSIÓN DEL MODELO POLINÓMICO\n",
  "=============================================\n"
)
## 
## =============================================
##  CONCLUSIÓN DEL MODELO POLINÓMICO
##  =============================================
cat(
  "El modelo polinómico cuadrático incorpora un término x²,\n",
  "por lo que permite representar una relación curvilínea entre\n",
  "la precipitación acumulada y el área afectada.\n"
)
## El modelo polinómico cuadrático incorpora un término x²,
##  por lo que permite representar una relación curvilínea entre
##  la precipitación acumulada y el área afectada.
cat(
  "El coeficiente de determinación fue R² =",
  round(r_cuadrado_pol, 4),
  ", lo que indica que el modelo explica aproximadamente",
  round(r_cuadrado_pol * 100, 2),
  "% de la variabilidad observada en el área afectada.\n"
)
## El coeficiente de determinación fue R² = 0.517 , lo que indica que el modelo explica aproximadamente 51.7 % de la variabilidad observada en el área afectada.
cat(
  "El coeficiente de Pearson entre las variables originales fue r =",
  round(r_pearson_pol, 3),
  "con p-value",
  format.pval(p_valor_pol, digits = 4),
  ".\n"
)
## El coeficiente de Pearson entre las variables originales fue r = 0.643 con p-value < 0.00000000000000022 .
cat(
  "El modelo permite realizar estimaciones dentro del rango observado,\n",
  "pero no debe extrapolarse hacia valores extremos de precipitación.\n"
)
## El modelo permite realizar estimaciones dentro del rango observado,
##  pero no debe extrapolarse hacia valores extremos de precipitación.
# =========================================================

MODELO 6: REGRESIÓN MULTIVARIABLE

# MODELO 6: REGRESIÓN MULTIVARIABLE
# Y = Área afectada por deslizamientos
# X1 = Precipitación acumulada en 7 días
# X2 = Pendiente del terreno
# X3 = Elevación
# X4 = Índice de humedad del suelo
# =========================================================


# =========================================================

1. LIBRERÍAS Y DATOS

# 1. LIBRERÍAS Y DATOS
# =========================================================

# Se reutiliza el dataset ya cargado: datos
# Se utilizarán funciones base de R.


# =========================================================

2. SELECCIÓN DE VARIABLES

# 2. SELECCIÓN DE VARIABLES
# =========================================================

# Variable dependiente o respuesta
# Y = área afectada por el deslizamiento

# Variables independientes o explicativas
# X1 = precipitación acumulada en 7 días
# X2 = pendiente del terreno
# X3 = elevación
# X4 = índice de humedad del suelo

datos_multivariable <- datos[, c(
  "area_affected_m2_synthetic",
  "precipitation_7d_mm_synthetic",
  "terrain_slope_deg_synthetic",
  "elevation_m_synthetic",
  "soil_moisture_index_synthetic"
)]

# Eliminar posibles filas incompletas
datos_multivariable <- na.omit(datos_multivariable)

# Renombrar columnas para trabajar más cómodamente
names(datos_multivariable) <- c(
  "area_afectada",
  "precipitacion_7_dias",
  "pendiente_terreno",
  "elevacion",
  "humedad_suelo"
)

# Revisar estructura
str(datos_multivariable)
## 'data.frame':    11033 obs. of  5 variables:
##  $ area_afectada       : num  1880 2183 784 1815 1399 ...
##  $ precipitacion_7_dias: num  60.2 115.8 47.1 52.5 12.5 ...
##  $ pendiente_terreno   : num  28.1 33 19.8 22.9 15.7 ...
##  $ elevacion           : num  2432 1358 1564 1501 1070 ...
##  $ humedad_suelo       : num  0.699 0.932 0.816 0.823 0.592 ...
summary(datos_multivariable)
##  area_afectada     precipitacion_7_dias pendiente_terreno   elevacion     
##  Min.   :  198.6   Min.   :  0.50       Min.   : 1.50     Min.   : 292.6  
##  1st Qu.: 1204.0   1st Qu.: 38.73       1st Qu.:16.05     1st Qu.:1592.1  
##  Median : 1827.9   Median : 62.74       Median :21.35     Median :2191.0  
##  Mean   : 2366.5   Mean   : 71.91       Mean   :21.37     Mean   :2430.6  
##  3rd Qu.: 2827.5   3rd Qu.: 94.77       3rd Qu.:26.76     3rd Qu.:3013.2  
##  Max.   :62703.7   Max.   :507.07       Max.   :54.99     Max.   :6500.0  
##  humedad_suelo   
##  Min.   :0.0978  
##  1st Qu.:0.5711  
##  Median :0.7727  
##  Mean   :0.7308  
##  3rd Qu.:0.9237  
##  Max.   :1.0000
# =========================================================

3. TABLA DE PARES Y VARIABLES SELECCIONADAS

# 3. TABLA DE PARES Y VARIABLES SELECCIONADAS
# =========================================================

# Mostrar los primeros registros utilizados en el modelo
head(datos_multivariable, 10)
##    area_afectada precipitacion_7_dias pendiente_terreno elevacion humedad_suelo
## 1         1879.8                60.21             28.14    2431.8        0.6991
## 2         2183.0               115.77             33.00    1357.9        0.9316
## 3          784.5                47.14             19.77    1564.0        0.8163
## 4         1815.4                52.52             22.85    1500.8        0.8226
## 5         1399.4                12.51             15.65    1069.9        0.5915
## 6         2568.7                84.97             23.76    2024.7        0.9407
## 7         2725.3               121.28             14.44    4202.4        0.9310
## 8         2167.9                83.39             11.02    2063.8        0.9337
## 9         1983.9                93.87             16.17    3947.0        0.8726
## 10        1835.7               105.27             25.24    1459.0        0.9837
# Guardar tabla de variables seleccionadas
write.csv(
  datos_multivariable,
  "tabla_variables_regresion_multivariable.csv",
  row.names = FALSE,
  fileEncoding = "UTF-8"
)


# =========================================================

4. GRÁFICAS DE DISPERSIÓN

# 4. GRÁFICAS DE DISPERSIÓN
# =========================================================

# Matriz de dispersión entre todas las variables
pairs(
  datos_multivariable,
  main = "Matriz de dispersión para regresión multivariable",
  pch = 16,
  col = rgb(0.12, 0.34, 0.72, 0.25)
)

# Gráfico principal:
# precipitación frente a área afectada
plot(
  datos_multivariable$precipitacion_7_dias,
  datos_multivariable$area_afectada,
  main = "Área afectada y precipitación acumulada",
  xlab = "Precipitación acumulada en 7 días (mm)",
  ylab = "Área afectada por deslizamiento (m²)",
  pch = 16,
  col = rgb(0.12, 0.34, 0.72, 0.25),
  cex = 0.7
)

grid()

# =========================================================

5. CONJETURA Y ESTRUCTURA MATEMÁTICA

# 5. CONJETURA Y ESTRUCTURA MATEMÁTICA
# =========================================================

# Conjetura:
# El área afectada puede explicarse mejor al considerar
# conjuntamente la precipitación, pendiente, elevación
# y humedad del suelo.

# Estructura matemática:
#
# Área afectada estimada =
# a +
# b1 * precipitación +
# b2 * pendiente +
# b3 * elevación +
# b4 * humedad del suelo
#
# Donde:
# a  = intercepto
# b1 = efecto de la precipitación
# b2 = efecto de la pendiente
# b3 = efecto de la elevación
# b4 = efecto de la humedad del suelo


# =========================================================

6. CÁLCULO DE PARÁMETROS DEL MODELO

# 6. CÁLCULO DE PARÁMETROS DEL MODELO
# =========================================================

modelo_multivariable <- lm(
  area_afectada ~
    precipitacion_7_dias +
    pendiente_terreno +
    elevacion +
    humedad_suelo,
  data = datos_multivariable
)

# Resumen completo del modelo
summary(modelo_multivariable)
## 
## Call:
## lm(formula = area_afectada ~ precipitacion_7_dias + pendiente_terreno + 
##     elevacion + humedad_suelo, data = datos_multivariable)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
##  -5655   -722   -106    552  51215 
## 
## Coefficients:
##                         Estimate  Std. Error t value             Pr(>|t|)    
## (Intercept)           -345.26880    74.19699  -4.653            0.0000033 ***
## precipitacion_7_dias    40.43648     0.50542  80.006 < 0.0000000000000002 ***
## pendiente_terreno       61.33676     1.81367  33.819 < 0.0000000000000002 ***
## elevacion                0.23566     0.01231  19.139 < 0.0000000000000002 ***
## humedad_suelo        -2845.24105   107.54940 -26.455 < 0.0000000000000002 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1492 on 11028 degrees of freedom
## Multiple R-squared:  0.5122, Adjusted R-squared:  0.512 
## F-statistic:  2894 on 4 and 11028 DF,  p-value: < 0.00000000000000022
# Extraer coeficientes
coeficientes_multi <- coef(modelo_multivariable)

intercepto_multi <- coeficientes_multi[1]
b_precipitacion <- coeficientes_multi[2]
b_pendiente <- coeficientes_multi[3]
b_elevacion <- coeficientes_multi[4]
b_humedad <- coeficientes_multi[5]

# Coeficiente de determinación
r_cuadrado_multi <- summary(modelo_multivariable)$r.squared
r_cuadrado_ajustado_multi <- summary(modelo_multivariable)$adj.r.squared

cat(
  "\nECUACIÓN DEL MODELO MULTIVARIABLE:\n"
)
## 
## ECUACIÓN DEL MODELO MULTIVARIABLE:
cat(
  "Área afectada estimada =",
  round(intercepto_multi, 2),
  "+",
  round(b_precipitacion, 2),
  "* precipitación +",
  round(b_pendiente, 2),
  "* pendiente +",
  round(b_elevacion, 2),
  "* elevación +",
  round(b_humedad, 2),
  "* humedad del suelo\n"
)
## Área afectada estimada = -345.27 + 40.44 * precipitación + 61.34 * pendiente + 0.24 * elevación + -2845.24 * humedad del suelo
cat(
  "\nR² =",
  round(r_cuadrado_multi, 4),
  "\n"
)
## 
## R² = 0.5122
cat(
  "R² ajustado =",
  round(r_cuadrado_ajustado_multi, 4),
  "\n"
)
## R² ajustado = 0.512
# =========================================================

7. SUPERPONER VALORES OBSERVADOS Y ESTIMADOS

# 7. SUPERPONER VALORES OBSERVADOS Y ESTIMADOS
# =========================================================

# Predicciones del modelo
datos_multivariable$area_estimada <- predict(modelo_multivariable)

# Comparación entre área observada y área estimada
plot(
  datos_multivariable$area_afectada,
  datos_multivariable$area_estimada,
  main = "Regresión multivariable: valores observados y estimados",
  xlab = "Área afectada observada (m²)",
  ylab = "Área afectada estimada por el modelo (m²)",
  pch = 16,
  col = rgb(0.12, 0.34, 0.72, 0.25),
  cex = 0.7
)

grid()

# Línea de ajuste perfecto
abline(
  a = 0,
  b = 1,
  col = "red",
  lwd = 3
)

legend(
  "topleft",
  legend = c(
    "Valores estimados",
    "Ajuste perfecto"
  ),
  col = c(
    rgb(0.12, 0.34, 0.72, 0.70),
    "red"
  ),
  pch = c(16, NA),
  lty = c(NA, 1),
  lwd = c(NA, 3),
  bty = "n"
)

mtext(
  paste0(
    "R² = ",
    round(r_cuadrado_multi, 3),
    "     R² ajustado = ",
    round(r_cuadrado_ajustado_multi, 3)
  ),
  side = 3,
  line = 0.2,
  cex = 0.85
)

# =========================================================

8. PEARSON, COVARIANZA Y MULTICOLINEALIDAD

# 8. PEARSON, COVARIANZA Y MULTICOLINEALIDAD
# =========================================================

# Matriz de correlación de Pearson
matriz_pearson_multi <- cor(
  datos_multivariable[, c(
    "area_afectada",
    "precipitacion_7_dias",
    "pendiente_terreno",
    "elevacion",
    "humedad_suelo"
  )],
  method = "pearson"
)

round(matriz_pearson_multi, 3)
##                      area_afectada precipitacion_7_dias pendiente_terreno
## area_afectada                1.000                0.643             0.225
## precipitacion_7_dias         0.643                1.000            -0.002
## pendiente_terreno            0.225               -0.002             1.000
## elevacion                    0.134               -0.001             0.026
## humedad_suelo                0.402                0.792             0.004
##                      elevacion humedad_suelo
## area_afectada            0.134         0.402
## precipitacion_7_dias    -0.001         0.792
## pendiente_terreno        0.026         0.004
## elevacion                1.000        -0.006
## humedad_suelo           -0.006         1.000
# Pearson entre Y y cada predictor
cor.test(
  datos_multivariable$area_afectada,
  datos_multivariable$precipitacion_7_dias,
  method = "pearson"
)
## 
##  Pearson's product-moment correlation
## 
## data:  datos_multivariable$area_afectada and datos_multivariable$precipitacion_7_dias
## t = 88.136, df = 11031, p-value < 0.00000000000000022
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.6317331 0.6536351
## sample estimates:
##       cor 
## 0.6428155
cor.test(
  datos_multivariable$area_afectada,
  datos_multivariable$pendiente_terreno,
  method = "pearson"
)
## 
##  Pearson's product-moment correlation
## 
## data:  datos_multivariable$area_afectada and datos_multivariable$pendiente_terreno
## t = 24.275, df = 11031, p-value < 0.00000000000000022
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.2074027 0.2428306
## sample estimates:
##       cor 
## 0.2251911
cor.test(
  datos_multivariable$area_afectada,
  datos_multivariable$elevacion,
  method = "pearson"
)
## 
##  Pearson's product-moment correlation
## 
## data:  datos_multivariable$area_afectada and datos_multivariable$elevacion
## t = 14.235, df = 11031, p-value < 0.00000000000000022
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.1159346 0.1525815
## sample estimates:
##       cor 
## 0.1343039
cor.test(
  datos_multivariable$area_afectada,
  datos_multivariable$humedad_suelo,
  method = "pearson"
)
## 
##  Pearson's product-moment correlation
## 
## data:  datos_multivariable$area_afectada and datos_multivariable$humedad_suelo
## t = 46.157, df = 11031, p-value < 0.00000000000000022
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.3865767 0.4178572
## sample estimates:
##       cor 
## 0.4023343
# Función para calcular VIF sin instalar librerías
calcular_vif <- function(modelo) {
  
  matriz_modelo <- model.matrix(modelo)[, -1]
  
  vif <- numeric(ncol(matriz_modelo))
  
  for (i in seq_along(vif)) {
    
    modelo_auxiliar <- lm(
      matriz_modelo[, i] ~ matriz_modelo[, -i]
    )
    
    r2_auxiliar <- summary(modelo_auxiliar)$r.squared
    
    vif[i] <- 1 / (1 - r2_auxiliar)
  }
  
  names(vif) <- colnames(matriz_modelo)
  
  return(vif)
}

vif_multivariable <- calcular_vif(modelo_multivariable)

cat("\nVIF de las variables explicativas:\n")
## 
## VIF de las variables explicativas:
round(vif_multivariable, 3)
## precipitacion_7_dias    pendiente_terreno            elevacion 
##                2.684                1.001                1.001 
##        humedad_suelo 
##                2.684
# Interpretación general:
# VIF cercano a 1 = poca multicolinealidad.
# VIF menor a 5 = aceptable.
# VIF mayor a 10 = multicolinealidad alta.


# =========================================================

8.1. RESTRICCIONES DEL MODELO

# 8.1 RESTRICCIONES DEL MODELO
# =========================================================

cat(
  "\nRESTRICCIONES DEL MODELO:\n"
)
## 
## RESTRICCIONES DEL MODELO:
cat(
  "- Las estimaciones deben realizarse dentro del rango observado.\n"
)
## - Las estimaciones deben realizarse dentro del rango observado.
cat(
  "- Las variables explicativas deben medirse con las mismas unidades.\n"
)
## - Las variables explicativas deben medirse con las mismas unidades.
cat(
  "- No se debe interpretar el modelo como una demostración absoluta de causalidad.\n"
)
## - No se debe interpretar el modelo como una demostración absoluta de causalidad.
cat(
  "- Debe verificarse que los VIF no sean excesivamente altos.\n"
)
## - Debe verificarse que los VIF no sean excesivamente altos.
# =========================================================

9. ESTIMACIÓN MEDIANTE EL MODELO

# 9. ESTIMACIÓN MEDIANTE EL MODELO
# =========================================================

# Escenario de ejemplo:
# Se utilizan valores razonables para generar una estimación.

nuevo_evento_multi <- data.frame(
  precipitacion_7_dias = 150,
  pendiente_terreno = median(datos_multivariable$pendiente_terreno),
  elevacion = median(datos_multivariable$elevacion),
  humedad_suelo = median(datos_multivariable$humedad_suelo)
)

estimacion_multi <- predict(
  modelo_multivariable,
  newdata = nuevo_evento_multi,
  interval = "prediction",
  level = 0.95
)

estimacion_multi
##        fit      lwr     upr
## 1 5347.562 2421.574 8273.55
cat(
  "\nESCENARIO DE ESTIMACIÓN:\n"
)
## 
## ESCENARIO DE ESTIMACIÓN:
cat(
  "Precipitación acumulada:",
  nuevo_evento_multi$precipitacion_7_dias,
  "mm\n"
)
## Precipitación acumulada: 150 mm
cat(
  "Pendiente:",
  round(nuevo_evento_multi$pendiente_terreno, 2),
  "grados\n"
)
## Pendiente: 21.35 grados
cat(
  "Elevación:",
  round(nuevo_evento_multi$elevacion, 2),
  "msnm\n"
)
## Elevación: 2191 msnm
cat(
  "Humedad del suelo:",
  round(nuevo_evento_multi$humedad_suelo, 2),
  "\n"
)
## Humedad del suelo: 0.77
cat(
  "Área afectada estimada:",
  round(estimacion_multi[1, "fit"], 2),
  "m²\n"
)
## Área afectada estimada: 5347.56 m²
cat(
  "Intervalo de predicción al 95%:",
  round(estimacion_multi[1, "lwr"], 2),
  "a",
  round(estimacion_multi[1, "upr"], 2),
  "m²\n"
)
## Intervalo de predicción al 95%: 2421.57 a 8273.55 m²
# =========================================================

10. CONCLUSIÓN DEL MODELO MULTIVARIABLE

# 10. CONCLUSIÓN DEL MODELO MULTIVARIABLE
# =========================================================

cat(
  "\n=============================================\n",
  "CONCLUSIÓN DEL MODELO MULTIVARIABLE\n",
  "=============================================\n"
)
## 
## =============================================
##  CONCLUSIÓN DEL MODELO MULTIVARIABLE
##  =============================================
cat(
  "El modelo multivariable estima el área afectada considerando\n",
  "simultáneamente precipitación, pendiente, elevación y humedad del suelo.\n"
)
## El modelo multivariable estima el área afectada considerando
##  simultáneamente precipitación, pendiente, elevación y humedad del suelo.
cat(
  "El modelo explica aproximadamente",
  round(r_cuadrado_multi * 100, 2),
  "% de la variabilidad observada en el área afectada.\n"
)
## El modelo explica aproximadamente 51.22 % de la variabilidad observada en el área afectada.
cat(
  "El R² ajustado fue de",
  round(r_cuadrado_ajustado_multi, 4),
  ", el cual considera el número de variables incluidas.\n"
)
## El R² ajustado fue de 0.512 , el cual considera el número de variables incluidas.
cat(
  "Las variables con p-value menor a 0.05 se consideran\n",
  "estadísticamente significativas dentro del modelo.\n"
)
## Las variables con p-value menor a 0.05 se consideran
##  estadísticamente significativas dentro del modelo.
cat(
  "El análisis VIF permite verificar que las variables independientes\n",
  "no presenten multicolinealidad excesiva.\n"
)
## El análisis VIF permite verificar que las variables independientes
##  no presenten multicolinealidad excesiva.
cat(
  "El modelo permite realizar estimaciones aproximadas dentro del rango\n",
  "observado, pero no demuestra causalidad absoluta.\n"
)
## El modelo permite realizar estimaciones aproximadas dentro del rango
##  observado, pero no demuestra causalidad absoluta.

Fin del documento