#===============================================================================
# 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)
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 |
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 (Φ) |
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 | ||
| N° | 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 |
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()
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.
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.
\[ Y = a + b\ln(X) \]
Donde:
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()
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"
)
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.
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()
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.
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 Φ.**