1. LIBRERÍAS

#===============================================================================
# 1. LIBRERÍAS
# Proyecto: Análisis de Regresión Logarítmica Simple aplicado a Sedimentos Marinos
#===============================================================================

#------------------------------------------------------------------------------
# Cargar las librerías necesarias.
#
# dplyr: permite filtrar, seleccionar y transformar los datos.
# gt: permite construir tablas con formato profesional.
# knitr: integra correctamente tablas, resultados y texto en RMarkdown.
#------------------------------------------------------------------------------

library(dplyr)
## 
## 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(gt)
library(knitr)

2. CARGA DE DATOS

En esta etapa se carga el conjunto de datos que contiene la información de los sedimentos marinos. Posteriormente, se presenta un resumen general de la base de datos indicando el número de observaciones y el número de variables, con el propósito de verificar que la información fue importada correctamente antes de iniciar el análisis estadístico.

#===============================================================================
# 2. CARGA DE DATOS
#===============================================================================

#------------------------------------------------------------------------------
# Lectura del archivo que contiene la información de los sedimentos marinos.
# Se especifica que la primera fila contiene los nombres de las variables, que
# el separador es una coma y que los textos no deben convertirse automáticamente
# en factores.
#------------------------------------------------------------------------------

datos <- read.csv(
  "C:/Users/Grace/Downloads/dataset_geologico_limpio_80.3.csv",
  header = TRUE,
  sep = ",",
  dec = ".",
  stringsAsFactors = FALSE
)

#------------------------------------------------------------------------------
# Resumen general del conjunto de datos.
#------------------------------------------------------------------------------

resumen_bd <- data.frame(
  Descripción = c(
    "Número de observaciones",
    "Número de variables"
  ),
  Valor = c(
    nrow(datos),
    ncol(datos)
  )
)

resumen_bd %>%
  gt() %>%
  tab_header(
    title = md("**Tabla N.°1. Resumen del conjunto de datos**")
  ) %>%
  cols_align(
    align = "center"
  ) %>%
  tab_options(
    table.width = pct(60),
    column_labels.font.weight = "bold"
  )
Tabla N.°1. Resumen del conjunto de datos
Descripción Valor
Número de observaciones 27784
Número de variables 58

3. SELECCIÓN DE VARIABLES

Para el desarrollo del modelo de regresión logarítmica se seleccionaron dos variables cuantitativas del conjunto de datos de sedimentos marinos. La variable independiente corresponde al porcentaje de arena presente en cada muestra (SAND_PCT), mientras que la variable dependiente corresponde al tamaño medio del grano (MEAN). Esta selección se fundamenta en que la composición granulométrica del sedimento influye sobre el tamaño medio de las partículas. En este caso, el comportamiento observado entre ambas variables permite plantear una relación no lineal compatible con un modelo logarítmico.

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

#------------------------------------------------------------------------------
# Definición de las variables del modelo.
#
# X: variable independiente, porcentaje de arena.
# Y: variable dependiente, tamaño medio del grano.
#
# Ambas variables se convierten a tipo numérico para garantizar que puedan
# utilizarse en el análisis estadístico.
#------------------------------------------------------------------------------

x_original <- as.numeric(datos$SAND_PCT)
y_original <- as.numeric(datos$MEAN)

tabla_variables <- data.frame(
  Rol = c(
    "Variable independiente (X)",
    "Variable dependiente (Y)"
  ),
  Variable = c(
    "SAND_PCT",
    "MEAN"
  ),
  Descripción = c(
    "Porcentaje de arena (%)",
    "Tamaño medio del grano (Φ)"
  )
)

tabla_variables %>%
  gt() %>%
  tab_header(
    title = md("**Tabla N.°2. Variables seleccionadas para el modelo de regresión logarítmica**")
  ) %>%
  cols_align(
    align = "center"
  ) %>%
  tab_options(
    table.width = pct(80),
    column_labels.font.weight = "bold"
  )
Tabla N.°2. Variables seleccionadas para el modelo de regresión logarítmica
Rol Variable Descripción
Variable independiente (X) SAND_PCT Porcentaje de arena (%)
Variable dependiente (Y) MEAN Tamaño medio del grano (Φ)

4. TABLA DE PARES DE VALORES

La tabla de pares de valores se construye a partir de las variables seleccionadas para el modelo de regresión logarítmica. Su propósito es organizar la información en pares ordenados (X,Y), donde cada observación representa simultáneamente el porcentaje de arena (SAND_PCT) y el tamaño medio del grano (MEAN). En esta etapa no se realiza ningún tratamiento estadístico sobre los datos, ya que primero es necesario observar el comportamiento natural de la nube de puntos mediante el diagrama de dispersión. Debido al tamaño del conjunto de datos, se presenta el tamaño muestral total y únicamente las primeras observaciones de la tabla.

#===============================================================================
# 4. TABLA DE PARES DE VALORES
#===============================================================================

#------------------------------------------------------------------------------
# Construcción de la tabla de pares ordenados (X,Y).
#------------------------------------------------------------------------------

TPV <- data.frame(
  x = x_original,
  y = y_original
)

n_muestral <- nrow(TPV)

cat("Tamaño muestral:", n_muestral)
## Tamaño muestral: 27784
#------------------------------------------------------------------------------
# Se agrega un número consecutivo únicamente para facilitar la lectura.
#------------------------------------------------------------------------------

TPV_tabla_inicial <- TPV %>%
  mutate(Nro = row_number()) %>%
  select(Nro, x, y)

head(TPV_tabla_inicial, 20) %>%
  gt() %>%
  cols_label(
    Nro = "N°",
    x = "SAND_PCT (%)",
    y = "MEAN (Φ)"
  ) %>%
  tab_header(
    title = md("**Tabla N.°3. Primeras filas de la tabla de pares de valores**")
  ) %>%
  fmt_number(
    columns = c(x, y),
    decimals = 4
  ) %>%
  cols_align(
    align = "center"
  ) %>%
  tab_options(
    table.width = pct(90),
    column_labels.font.weight = "bold"
  )
Tabla N.°3. Primeras filas de la tabla de pares de valores
SAND_PCT (%) MEAN (Φ)
1 54.0000 4.7570
2 93.6000 5.1800
3 100.0000 5.2537
4 100.0000 5.0511
5 84.0000 5.0727
6 58.1000 4.7875
7 36.8000 4.4233
8 35.1000 3.9934
9 NA NA
10 96.2000 5.5029
11 74.9000 5.0744
12 29.3077 4.4051
13 31.8000 4.4813
14 27.5000 4.0843
15 3.0000 2.6845
16 94.0000 4.8260
17 100.0000 5.2996
18 97.0000 5.2510
19 100.0000 5.3910
20 100.0000 5.1334

5. GRÁFICA DE DISPERSIÓN

El diagrama de dispersión constituye la primera herramienta de análisis del modelo de regresión, ya que permite visualizar el comportamiento conjunto de las variables seleccionadas. A través de la nube de puntos es posible identificar la dirección de la relación, la forma de asociación entre las variables y la posible necesidad de aplicar algún tratamiento previo. Esta representación gráfica sirve como base para formular la conjetura del modelo.

#===============================================================================
# 5. GRÁFICA DE DISPERSIÓN INICIAL
#===============================================================================

#------------------------------------------------------------------------------
# Preparación de los datos para la representación gráfica.
#
# En esta etapa únicamente se retiran registros que no pueden representarse en
# el plano cartesiano o que no permiten aplicar el logaritmo natural de la
# variable independiente. Esto no constituye un tratamiento estadístico de la
# nube de puntos, sino una condición técnica del modelo logarítmico.
#------------------------------------------------------------------------------

TPV_grafica_inicial <- TPV %>%
  filter(
    !is.na(x),
    !is.na(y),
    is.finite(x),
    is.finite(y),
    x > 0,
    x <= 100
  )

#------------------------------------------------------------------------------
# Se grafican todos los pares de valores técnicamente válidos. Esto permite que
# la conjetura se formule a partir de la nube completa de datos y no de una
# muestra parcial.
#------------------------------------------------------------------------------

plot(
  TPV_grafica_inicial$x,
  TPV_grafica_inicial$y,
  pch = 16,
  cex = 0.50,
  col = rgb(0, 0, 1, 0.22),
  main = "Gráfica N.°1. Diagrama de dispersión entre SAND_PCT y MEAN",
  xlab = "SAND_PCT (Porcentaje de arena, %)",
  ylab = "MEAN (Tamaño medio del grano, Φ)"
)

grid()
box()

6. CONJETURA DEL MODELO

A partir del diagrama de dispersión se formula una primera conjetura sobre la relación entre las variables. La nube de puntos presenta una relación creciente no lineal: el tamaño medio del grano aumenta conforme se incrementa el porcentaje de arena, pero el cambio no se observa como una línea recta perfecta en todo el dominio. Este comportamiento es compatible con una función logarítmica, ya que el incremento puede ser más marcado en ciertos rangos de SAND_PCT y luego cambiar de ritmo conforme la variable independiente aumenta. Por ello, se propone que la relación entre SAND_PCT y MEAN puede representarse mediante un modelo de regresión logarítmica simple.

6.1 JUSTIFICACIÓN DE NO APLICACIÓN DE TRATAMIENTO

Al observar la Gráfica N.°1, construida con todos los pares de valores técnicamente válidos, se identifica una nube de puntos con una tendencia creciente clara y compatible con el modelo logarítmico propuesto. La distribución no presenta un comportamiento caótico, una dispersión excesiva ni una forma irregular que obligue a segmentar los datos, eliminar observaciones atípicas o aplicar transformaciones adicionales antes de ajustar el modelo.

Por esta razón, no se aplica tratamiento estadístico sobre la nube de puntos. En particular, no se realiza eliminación de valores atípicos mediante IQR, no se agrupan observaciones repetidas por promedios, no se segmentan los datos por partes y no se transforma la variable dependiente. Aplicar alguno de estos procedimientos sin necesidad podría modificar el comportamiento natural de la información y alterar la relación observada entre las variables.

La única restricción aplicada corresponde a una condición técnica del modelo logarítmico: SAND_PCT debe ser mayor que cero para poder calcular ln(SAND_PCT). Esta validación no se considera tratamiento estadístico, sino una condición matemática necesaria para ajustar el modelo. En consecuencia, se conserva la nube original técnicamente válida y se continúa directamente con el cálculo de parámetros. Debido a que no se realiza tratamiento de datos, tampoco es necesario construir una nueva gráfica de dispersión ni formular una nueva conjetura.

Forma general del modelo propuesto

\[ Y = a + b\ln(X) \]

Donde:

  • Y = MEAN
  • X = SAND_PCT
  • a = Intercepto del modelo
  • b = Pendiente asociada al logaritmo natural de X

7. CÁLCULO DE PARÁMETROS

Una vez planteada la conjetura del modelo, se procede a estimar sus parámetros mediante el método de mínimos cuadrados ordinarios. Previamente, se realiza una validación técnica para garantizar que el modelo se ajuste únicamente con observaciones numéricas válidas y con valores de SAND_PCT mayores que cero, debido a la naturaleza de la función logarítmica.

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

#------------------------------------------------------------------------------
# Validación técnica de los datos.
#
# Se conservan únicamente los pares de valores que pueden utilizarse en el ajuste
# del modelo logarítmico. Esta validación no corresponde a un tratamiento
# estadístico; solo garantiza que los datos sean numéricos, finitos y que la
# variable independiente cumpla el dominio matemático x > 0.
#------------------------------------------------------------------------------

TPV_modelo <- TPV %>%
  filter(
    !is.na(x),
    !is.na(y),
    is.finite(x),
    is.finite(y),
    x > 0,
    x <= 100
  )

x <- TPV_modelo$x
y <- TPV_modelo$y

#------------------------------------------------------------------------------
# Ajuste del modelo de regresión logarítmica:
#
#        Y = a + b ln(X)
#------------------------------------------------------------------------------

modelo_log <- lm(y ~ log(x))

coeficientes <- coef(modelo_log)

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

tabla_parametros <- data.frame(
  Parámetro = c(
    "Intercepto (a)",
    "Pendiente (b)"
  ),
  Valor = c(
    intercepto,
    pendiente
  )
)

tabla_parametros %>%
  gt() %>%
  fmt_number(
    columns = Valor,
    decimals = 4
  ) %>%
  cols_align(
    align = "center"
  ) %>%
  tab_header(
    title = md("**Tabla N.°4. Parámetros estimados del modelo de regresión logarítmica**")
  ) %>%
  tab_options(
    table.width = pct(80),
    column_labels.font.weight = "bold"
  )
Tabla N.°4. Parámetros estimados del modelo de regresión logarítmica
Parámetro Valor
Intercepto (a) 2.2220
Pendiente (b) 0.6251
#===============================================================================
# ECUACIÓN DEL MODELO LOGARÍTMICO
#===============================================================================

ecuacion <- paste0(
  "MEAN (Φ) = ",
  round(intercepto, 4),
  ifelse(pendiente >= 0, " + ", " - "),
  round(abs(pendiente), 4),
  " · ln(SAND_PCT)"
)

plot.new()
plot.window(
  xlim = c(0, 100),
  ylim = c(0, 100)
)

rect(
  5, 58,
  95, 92,
  border = "#1F4E79",
  lwd = 3
)

text(
  50,
  87,
  "MODELO TEÓRICO",
  font = 2,
  cex = 1.45,
  col = "#1F4E79"
)

text(
  50,
  72,
  "MEAN (Φ) = a + b · ln(SAND_PCT)",
  font = 2,
  cex = 1.25,
  col = "#C0392B"
)

rect(
  5, 8,
  95, 48,
  border = "#1F4E79",
  lwd = 3
)

text(
  50,
  43,
  "MODELO LOGARÍTMICO AJUSTADO",
  font = 2,
  cex = 1.35,
  col = "#1F4E79"
)

text(
  50,
  24,
  ecuacion,
  font = 2,
  cex = 1.12,
  col = "#C0392B"
)

text(
  50,
  3,
  "Ecuación obtenida mediante el método de mínimos cuadrados ordinarios.",
  cex = 0.85,
  col = "gray40"
)

box()

8. REALIDAD Y MODELO

Una vez estimados los parámetros del modelo de regresión logarítmica, se compara la curva ajustada con las observaciones reales. Esta superposición permite evaluar visualmente si el modelo obtenido representa adecuadamente la relación existente entre el porcentaje de arena (SAND_PCT) y el tamaño medio del grano (MEAN).

#===============================================================================
# 8. REALIDAD Y MODELO
#===============================================================================

x_modelo <- seq(
  from = min(x),
  to = max(x),
  length.out = 300
)

y_modelo <- predict(
  modelo_log,
  newdata = data.frame(
    x = x_modelo
  )
)

plot(
  x,
  y,
  pch = 16,
  cex = 0.50,
  col = rgb(0, 0, 1, 0.22),
  main = "Gráfica N.°2. Superposición del modelo logarítmico\ncon las observaciones reales",
  xlab = "SAND_PCT (Porcentaje de arena, %)",
  ylab = "MEAN (Tamaño medio del grano, Φ)"
)

lines(
  x_modelo,
  y_modelo,
  col = "red3",
  lwd = 3
)

grid()
box()

legend(
  "bottomright",
  legend = c(
    "Observaciones reales",
    "Modelo logarítmico"
  ),
  pch = c(
    16,
    NA
  ),
  lty = c(
    NA,
    1
  ),
  lwd = c(
    NA,
    3
  ),
  col = c(
    rgb(0, 0, 1, 0.22),
    "red3"
  ),
  bty = "n"
)

9. TEST

Una vez ajustado el modelo de regresión logarítmica, se evalúa su calidad mediante el coeficiente de correlación de Pearson y el coeficiente de determinación. Estos indicadores permiten medir la intensidad de la relación entre las variables transformadas según el modelo y la proporción de la variabilidad de la variable dependiente que es explicada por la regresión.

#===============================================================================
# 9. TEST
#===============================================================================

r <- cor(log(x), y)
R2 <- summary(modelo_log)$r.squared

tabla_tests <- data.frame(
  Indicador = c(
    "Coeficiente de correlación de Pearson (r)",
    "Coeficiente de determinación (R²)"
  ),
  Valor = c(
    r,
    R2
  )
)

tabla_tests %>%
  gt() %>%
  cols_label(
    Indicador = "Indicador estadístico",
    Valor = "Valor"
  ) %>%
  fmt_number(
    columns = Valor,
    decimals = 4
  ) %>%
  cols_align(
    align = "center"
  ) %>%
  tab_header(
    title = md("**Tabla N.°5. Indicadores estadísticos para evaluar la calidad del ajuste**")
  ) %>%
  tab_options(
    table.width = pct(85),
    column_labels.font.weight = "bold"
  )
Tabla N.°5. Indicadores estadísticos para evaluar la calidad del ajuste
Indicador estadístico Valor
Coeficiente de correlación de Pearson (r) 0.9693
Coeficiente de determinación (R²) 0.9395

Interpretación: El coeficiente de correlación de Pearson obtenido fue r = 0.9693, lo que indica una relación positiva fuerte entre ln(SAND_PCT) y el tamaño medio del grano (MEAN). Asimismo, el coeficiente de determinación fue R² = 0.9395, indicando que el 93.95 % de la variabilidad observada en MEAN es explicada por el modelo de regresión logarítmica, mientras que el 6.05 % restante se atribuye a otros factores no considerados en el modelo.

10. RESTRICCIONES

Las restricciones del modelo logarítmico están determinadas por dos aspectos: el dominio matemático de la función logarítmica y el intervalo observado en el conjunto de datos. Debido a que ln(X) solo está definido para valores positivos, el porcentaje de arena debe ser mayor que cero. Además, las estimaciones deben realizarse dentro del rango observado de SAND_PCT para evitar extrapolaciones poco confiables.

#===============================================================================
# 10. RESTRICCIONES
#===============================================================================

xmin <- min(x)
xmax <- max(x)

plot.new()
plot.window(
  xlim = c(0, 100),
  ylim = c(0, 100)
)

rect(
  5, 10,
  95, 90,
  border = "#1F4E79",
  lwd = 3
)

text(
  50,
  84,
  "RESTRICCIONES DEL MODELO",
  cex = 1.45,
  font = 2,
  col = "#1F4E79"
)

text(
  50,
  68,
  "Dominio matemático:",
  cex = 1.15,
  font = 2
)

text(
  50,
  60,
  "SAND_PCT > 0",
  cex = 1.35,
  font = 2,
  col = "#C0392B"
)

text(
  50,
  44,
  "Rango observado del conjunto de datos:",
  cex = 1.10,
  font = 2
)

text(
  50,
  35,
  paste0(
    round(xmin, 2),
    " <= SAND_PCT <= ",
    round(xmax, 2)
  ),
  cex = 1.20,
  col = "#C0392B",
  font = 2
)

text(
  50,
  18,
  "No se recomienda extrapolar el modelo fuera del intervalo observado.",
  cex = 0.85,
  col = "gray40"
)

box()

11. ESTIMACIÓN

En esta sección se utiliza el modelo de regresión logarítmica obtenido para estimar el tamaño medio del grano (MEAN) correspondiente a un porcentaje específico de arena (SAND_PCT). Esta estimación debe interpretarse dentro del intervalo observado y considerando que el modelo describe una tendencia estadística, no una predicción exacta para todos los casos individuales.

#===============================================================================
# 11. ESTIMACIÓN
#===============================================================================

x_estimacion <- 60

y_estimacion <- predict(
  modelo_log,
  newdata = data.frame(
    x = x_estimacion
  )
)

plot.new()
plot.window(
  xlim = c(0, 100),
  ylim = c(0, 100)
)

rect(
  5, 15,
  95, 85,
  border = "#1F4E79",
  lwd = 3
)

text(
  50,
  79,
  "ESTIMACIÓN DEL MODELO LOGARÍTMICO",
  cex = 1.30,
  font = 2,
  col = "#1F4E79"
)

text(
  50,
  63,
  "Para una muestra con un porcentaje de arena (SAND_PCT) igual a",
  cex = 0.92
)

text(
  50,
  55,
  paste0(
    x_estimacion,
    " %"
  ),
  cex = 1.40,
  font = 2,
  col = "#C0392B"
)

text(
  50,
  43,
  "el modelo estima un tamaño medio del grano (MEAN) de:",
  cex = 1.00
)

text(
  50,
  30,
  paste0(
    round(as.numeric(y_estimacion), 4),
    " Φ"
  ),
  cex = 2,
  font = 2,
  col = "#C0392B"
)

text(
  50,
  18,
  "Estimación obtenida mediante el modelo de regresión logarítmica ajustado.",
  cex = 0.82,
  col = "gray40"
)

box()

Interpretación: Para una muestra de sedimento marino con un porcentaje de arena (SAND_PCT) de 60 %, el modelo de regresión logarítmica estima un tamaño medio del grano (MEAN) de 4.7811 Φ. Esta estimación fue obtenida mediante la ecuación ajustada del modelo y debe interpretarse dentro del intervalo de aplicación establecido.

12. CONCLUSIÓN

El análisis realizado permitió establecer que existe una relación logarítmica positiva entre el porcentaje de arena (SAND_PCT) y el tamaño medio del grano (MEAN). A partir del diagrama de dispersión se formuló la conjetura de un modelo de regresión logarítmica simple, sin que fuera necesario aplicar tratamientos sobre los datos, debido a que la nube de puntos presentó una tendencia creciente compatible con una función logarítmica. Mediante el método de mínimos cuadrados se obtuvo el modelo \(MEAN = 2.222 + 0.6251 \times ln(SAND\_PCT)\), el cual presentó un coeficiente de correlación de Pearson de 0.9693, indicando una relación positiva muy fuerte entre las variables, y un coeficiente de determinación de 0.9395, lo que significa que el 93.95 %** de la variabilidad del tamaño medio del grano es explicada por el porcentaje de arena mediante el modelo logarítmico. Finalmente, el modelo permite realizar estimaciones confiables dentro del rango observado de los datos; por ejemplo, para una muestra con 60 % de arena se estimó un tamaño medio del grano de 4.7811 Φ.**