CARGA DE DATOS Y 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
datos <- read.csv("ESTADISTICA/dataset_geologico_limpio_80.csv")
# Variables
x <- as.numeric(datos$SAND_PCT) # % Arena (independiente)
y <- as.numeric(datos$CLAY_PCT) # % Arcilla (dependiente)
# Limpieza inicial
tabla <- data.frame(x, y)
tabla <- tabla %>%
filter(is.finite(x), is.finite(y),
x >= 0, x <= 100,
y >= 0, y <= 100)
# Eliminación de outliers (IQR)
Q1_x <- quantile(tabla$x, 0.25)
Q3_x <- quantile(tabla$x, 0.75)
Q1_y <- quantile(tabla$y, 0.25)
Q3_y <- quantile(tabla$y, 0.75)
IQR_x <- Q3_x - Q1_x
IQR_y <- Q3_y - Q1_y
tabla_limpia <- tabla %>%
filter(x >= (Q1_x - 1.5*IQR_x), x <= (Q3_x + 1.5*IQR_x),
y >= (Q1_y - 1.5*IQR_y), y <= (Q3_y + 1.5*IQR_y))
cat("Observaciones después de limpieza:", nrow(tabla_limpia), "\n")
## Observaciones después de limpieza: 25430
Tabla de pares de valores
#Paso 2 Tabla de pares de valores
datatable(tabla_limpia,
caption = htmltools::tags$caption(
style = "caption-side: top; text-align: center; font-weight: bold;",
"Tabla Nro. 3. Pares de valores limpios"
),
extensions = "Scroller",
options = list(scrollY = 400, scrollX = TRUE, pageLength = 10),
rownames = FALSE)
Diagrama de dispersión
# PASO 3: Gráfica de dispersión
plot(tabla_limpia$x, tabla_limpia$y,
pch = 16, col = "blue",
xlab = "Porcentaje de arena (%)",
ylab = "Porcentaje de arcilla (%)",
main = "Gráfica N 3: Diagrama de dispersión (datos limpios)")

Conjetura del Modelo
# PASO 4: Ajuste del modelo de regresión lineal
modelo_exp <- nls(y ~ a * exp(b * x),
data = tabla_limpia,
start = list(a = 80, b = -0.04))
# Parámetros del modelo
a_est <- round(coef(modelo_exp)["a"], 4) # Intercepto (amplitud)
b_est <- round(coef(modelo_exp)["b"], 6) # Exponente (tasa de decrecimiento)
cat("\n=== PARÁMETROS DEL MODELO EXPONENCIAL ===\n")
##
## === PARÁMETROS DEL MODELO EXPONENCIAL ===
cat("Intercepto (a) =", a_est, "\n")
## Intercepto (a) = 36.3519
cat("Exponente (b) =", b_est, "\n")
## Exponente (b) = -0.025211
cat("Ecuación: y =", a_est, "* exp(", b_est, "* x)\n")
## Ecuación: y = 36.3519 * exp( -0.025211 * x)
# PASO 5: Gráfica con la recta de regresión
plot(tabla_limpia$x, tabla_limpia$y,
pch = 16, col = "blue",
xlab = "Porcentaje de arena (%)",
ylab = "Porcentaje de arcilla (%)",
main = "Gráfica N 4: Modelo Exponencial Ajustado")
curve(a_est * exp(b_est * x), add = TRUE, col = "red", lwd = 3)
legend("topright", "Modelo exponencial", col = "red", lwd = 3, bty = "n")

# Gráfica agrupada (PROMEDIOS)
# =========================
tabla_agrupada <- tabla_limpia %>%
mutate(grupo = round(x, 0)) %>%
group_by(grupo) %>%
summarise(
x_prom = mean(x),
y_prom = mean(y),
.groups = "drop"
)
plot(
tabla_agrupada$x_prom,
tabla_agrupada$y_prom,
pch = 16,
col = "blue",
xlab = "Arena (%)",
ylab = "Arcilla (%)",
main = "Datos agrupados (promedios)"
)
curve(a_est * exp(b_est * x),
add = TRUE,
col = "red",
lwd = 3)

# PASO 6: Ecuación del modelo
# =========================================================
# Ecuación del Modelo
# =========================================================
plot(1, type = "n", axes = FALSE, xlab = "", ylab = "",
xlim = c(0, 2), ylim = c(0, 2))
text(1, 1.8, "ECUACIÓN DEL MODELO EXPONENCIAL", cex = 1.5, col = "darkblue", font = 2)
text(1, 1.35,
paste0("Y = ", a_est, " × e^(", b_est, " × x)"),
cex = 1.5, col = "blue", font = 2)
text(1, 0.95, "Donde:", cex = 1.9, col = "black")
text(1, 0.65, "Y = Porcentaje de Arcilla (%)", cex = 1.7, col = "black")
text(1, 0.45, "x = Porcentaje de Arena (%)", cex = 1.7, col = "black")

Evaluación del modelo y Restricciones
# PASO 7:Evaluación del modelo
# =========================================================
# Evaluación del modelo
# =========================================================
r <- cor(tabla_limpia$x, tabla_limpia$y)
r2 <- r^2
cat("\nCoeficiente de correlación |r| =", round(abs(r)*100, 2), "%\n")
##
## Coeficiente de correlación |r| = 77.49 %
cat("Coeficiente de determinación (R²) =", round(r2*100, 2), "%\n")
## Coeficiente de determinación (R²) = 60.04 %
# PASO 8: Restricciones del modelo
# =========================================================
# Restricciones del modelo
# =========================================================
cat("\n=== RESTRICCIONES DEL MODELO ===\n")
##
## === RESTRICCIONES DEL MODELO ===
cat("- Dominio de x (Porcentaje de Arena): [0, 100]\n")
## - Dominio de x (Porcentaje de Arena): [0, 100]
cat("- Dominio de y (Porcentaje de Arcilla): [0, 100]\n")
## - Dominio de y (Porcentaje de Arcilla): [0, 100]
cat("- El modelo es válido dentro del rango observado de los datos.\n")
## - El modelo es válido dentro del rango observado de los datos.
cat("- No se recomienda extrapolar fuera de 0% - 100%.\n")
## - No se recomienda extrapolar fuera de 0% - 100%.
cat("- La función exponencial siempre genera valores positivos dentro del dominio.\n")
## - La función exponencial siempre genera valores positivos dentro del dominio.
Cálculo de Pronosticos
# PASO 9: cálculo de Pronósticos
cat("\n=== PRONÓSTICOS ===\n")
##
## === PRONÓSTICOS ===
arena_values <- c(20, 40, 60, 80)
for (arena in arena_values) {
arcilla_pred <- a_est * exp(b_est * arena)
cat(sprintf("Si Arena = %d%% → Arcilla esperada ≈ %.2f%%\n", arena, arcilla_pred))
}
## Si Arena = 20% → Arcilla esperada ≈ 21.96%
## Si Arena = 40% → Arcilla esperada ≈ 13.26%
## Si Arena = 60% → Arcilla esperada ≈ 8.01%
## Si Arena = 80% → Arcilla esperada ≈ 4.84%
# Pronóstico en cuadro grande
plot(1, type = "n", axes = FALSE, xlab = "", ylab = "")
text(x = 1, y = 1,
labels = paste0("¿Qué porcentaje de arcilla se espera\n",
"cuando el porcentaje de arena es 60%?\n\n",
"Respuesta = ", round(a_est * exp(b_est * 60), 2), " %"),
cex = 1.8, col = "blue", font = 2)

Conclusiones
cat("\n=== CONCLUSIÓN ===\n")
##
## === CONCLUSIÓN ===
cat("Se ajustó un modelo exponencial entre el porcentaje de arena y el porcentaje de arcilla.\n")
## Se ajustó un modelo exponencial entre el porcentaje de arena y el porcentaje de arcilla.
cat("Ecuación: ŷ =", a_est, "* e^(", b_est, " * x)\n")
## Ecuación: ŷ = 36.3519 * e^( -0.025211 * x)
cat("La relación es decreciente: a mayor porcentaje de arena, menor porcentaje de arcilla.\n")
## La relación es decreciente: a mayor porcentaje de arena, menor porcentaje de arcilla.
cat("El modelo explica aproximadamente un", round(r2*100, 2), "% de la variabilidad observada.\n")
## El modelo explica aproximadamente un 60.04 % de la variabilidad observada.
cat("Esto es consistente con la sedimentología marina: los sedimentos finos (arcilla) predominan donde hay menos arena.\n")
## Esto es consistente con la sedimentología marina: los sedimentos finos (arcilla) predominan donde hay menos arena.