# =============================================================================
# MODELO DE REGRESIÓN EXPONENCIAL DECRECIENTE
# Usando datos REALES del dataset geológico
# Variable dependiente: SAND_PCT (% Arena)
# Variable independiente: DEPTH_M (Profundidad en metros)
# =============================================================================
# Cargar datos
datos <- read.csv("ESTADISTICA/dataset_geologico_limpio_80.csv")
# Librerías
library(DT)
## Warning: package 'DT' was built under R version 4.5.3
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.5.3
##
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(nls2) # Para mayor estabilidad en nls
## Warning: package 'nls2' was built under R version 4.5.3
## Cargando paquete requerido: proto
## Warning: package 'proto' was built under R version 4.5.3
# =============================================================================
# PASO 1: Selección y limpieza de variables
# =============================================================================
# Variable independiente (x): Profundidad del agua (m)
# Variable dependiente (y): Porcentaje de arena (%)
datos_modelo <- datos %>%
select(DEPTH_M, SAND_PCT) %>%
na.omit() %>% # Eliminar filas con NA
filter(DEPTH_M >= 0, # Profundidad no negativa
SAND_PCT >= 0, SAND_PCT <= 100) # % Arena entre 0 y 100
x <- datos_modelo$DEPTH_M
y <- datos_modelo$SAND_PCT
cat("Número de observaciones utilizadas:", nrow(datos_modelo), "\n")
## Número de observaciones utilizadas: 26359
# =============================================================================
# PASO 2: Tabla de pares de valores (datos reales)
# =============================================================================
tabla_real <- data.frame(
Profundidad_m = x,
Porcentaje_Arena = y
)
datatable(tabla_real,
caption = htmltools::tags$caption(
style = "caption-side: top; text-align: center; font-weight: bold;",
"Tabla 1. Pares de valores reales: Profundidad vs Porcentaje de arena"
),
extensions = c("Scroller"),
options = list(scrollY = 400, scrollX = TRUE, pageLength = 10),
rownames = FALSE
)
# =============================================================================
# PASO 3: Gráfica de dispersión (datos reales)
# =============================================================================
plot(x, y,
main = "Gráfica 1: Dispersión entre Profundidad y % de Arena (datos reales)",
xlab = "Profundidad del agua (metros)",
ylab = "Porcentaje de arena (%)",
pch = 16,
col = rgb(0, 0.4, 0.8, 0.6),
cex = 0.7)

# =============================================================================
# PASO 4: Ajuste del modelo exponencial decreciente
# =============================================================================
# Modelo: y = a + c * exp(-b * x)
modelo <- nls(y ~ a + c * exp(-b * x),
data = datos_modelo,
start = list(a = 5, c = 80, b = 0.002), # valores iniciales razonables
control = nls.control(maxiter = 100))
## Warning in min(x): ningún argumento finito para min; retornando Inf
## Warning in max(x): ningun argumento finito para max; retornando -Inf
# Extraer parámetros
param <- coef(modelo)
a_est <- round(param["a"], 4)
c_est <- round(param["c"], 4)
b_est <- round(param["b"], 6)
cat("\n=== PARÁMETROS DEL MODELO ===\n")
##
## === PARÁMETROS DEL MODELO ===
cat("a =", a_est, "\n")
## a = 8.462
cat("c =", c_est, "\n")
## c = 56.7963
cat("b =", b_est, "\n")
## b = 0.000598
cat("Ecuación ajustada: ŷ =", a_est, "+", c_est, "* exp(-", b_est, "* x)\n")
## Ecuación ajustada: ŷ = 8.462 + 56.7963 * exp(- 0.000598 * x)
# =============================================================================
# PASO 5: Gráfica con curva del modelo ajustado
# =============================================================================
plot(x, y,
main = "Gráfica 2: Modelo Exponencial Decreciente Ajustado\n% Arena vs Profundidad",
xlab = "Profundidad del agua (m)",
ylab = "Porcentaje de arena (%)",
pch = 16,
col = rgb(0, 0.4, 0.8, 0.6),
cex = 0.7)
curve(a_est + c_est * exp(-b_est * x),
from = min(x), to = max(x),
add = TRUE, col = "red", lwd = 3)
legend("topright", legend = "Modelo exponencial ajustado",
col = "red", lwd = 3, bty = "n")

# =============================================================================
# PASO 6: Evaluación del modelo (Correlación y determinación)
# =============================================================================
# Correlación de Pearson (lineal)
r <- cor(x, y)
r_porcentaje <- round(abs(r) * 100, 2)
# Coeficiente de determinación aproximado (para modelo no lineal se usa con precaución)
r2 <- round(r^2 * 100, 2)
cat("\nCoeficiente de correlación lineal (r):", r_porcentaje, "%\n")
##
## Coeficiente de correlación lineal (r): 28.08 %
cat("Coeficiente de determinación aproximado (r²):", r2, "%\n")
## Coeficiente de determinación aproximado (r²): 7.88 %
# =============================================================================
# PASO 7: Pronóstico (ejemplo)
# =============================================================================
profundidades_prueba <- c(10, 50, 100, 500, 2000)
pronostico <- a_est + c_est * exp(-b_est * profundidades_prueba)
cat("\n=== PRONÓSTICOS ===\n")
##
## === PRONÓSTICOS ===
for(i in 1:length(profundidades_prueba)){
cat("A", profundidades_prueba[i], "m de profundidad → Arena esperada:",
round(pronostico[i], 2), "%\n")
}
## A 10 m de profundidad → Arena esperada: 64.92 %
## A 50 m de profundidad → Arena esperada: 63.59 %
## A 100 m de profundidad → Arena esperada: 61.96 %
## A 500 m de profundidad → Arena esperada: 50.58 %
## A 2000 m de profundidad → Arena esperada: 25.64 %
# =============================================================================
# PASO 8: Conclusión (actualiza con tus resultados)
# =============================================================================
cat("\n=== CONCLUSIÓN ===\n")
##
## === CONCLUSIÓN ===
cat("Se ajustó un modelo exponencial decreciente entre la profundidad del agua y el porcentaje de arena.\n")
## Se ajustó un modelo exponencial decreciente entre la profundidad del agua y el porcentaje de arena.
cat("Ecuación: ŷ =", a_est, "+", c_est, "· e^(-", b_est, "· x)\n")
## Ecuación: ŷ = 8.462 + 56.7963 · e^(- 0.000598 · x)
cat("Esto confirma que a mayor profundidad, el contenido de arena tiende a disminuir exponencialmente,\n")
## Esto confirma que a mayor profundidad, el contenido de arena tiende a disminuir exponencialmente,
cat("lo cual es consistente con los procesos sedimentológicos (sedimentos gruesos se depositan en aguas someras).\n")
## lo cual es consistente con los procesos sedimentológicos (sedimentos gruesos se depositan en aguas someras).
cat("El modelo explica aproximadamente un", r2, "% de la variabilidad en los datos.\n")
## El modelo explica aproximadamente un 7.88 % de la variabilidad en los datos.