1. CARGA DE DATOS YLIBRERÍAS

#Esta sección carga las librerías necesarias para desarrollar el análisis estadístico.

#Cada una cumple una función específica:

library(knitr)  # Integración de tablas en RMarkdown
library(scatterplot3d) # Crea el Diagrama de dispersion 3D
library(dplyr) # Manipulación de datos
library(gt)   # Creación de tablas profesionales
# Lectura del archivo que contiene la información de los sedimentos marinos.
# Se especifica que la primera fila contiene los nombres de las variables,
# el separador corresponde a una coma y los datos se importan sin convertir
# automáticamente los textos en factores.

datos <- read.csv("C:/Users/arian/OneDrive/Documentos/Universidad/3er SEMESTRE/estadistica/2026/datos/dataset_geologico_limpio_80.csv", 
                  header = TRUE, 
                  sep = ",",
                  dec = ".",
                  stringsAsFactors = FALSE)

# Resumen general del conjunto de datos.
cat("Dimensiones:", nrow(datos), "observaciones,", ncol(datos), "variables\n\n")
## Dimensiones: 27784 observaciones, 58 variables
# 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)))

# PRESENTACIÓN DE LA TABLA RESUMEN
resumen_bd %>%
  gt() %>%
  tab_header(
    title = md("**Tabla N.°1. Resumen del conjunto de datos**")
  ) %>%
  cols_align(
    align = "center"
  ) %>%
  fmt_number(
    columns = Valor,
    decimals = 0,
    use_seps = TRUE
  ) %>%
  tab_options(
    table.width = pct(60),
    column_labels.font.weight = "bold",
    heading.align = "center"
  )
Tabla N.°1. Resumen del conjunto de datos
Descripción Valor
Número de observaciones 27,784
Número de variables 58

2. SELECCIÓN DE VARIABLES

Para el modelo multivariable lineal se seleccionan las siguientes variables granulométricas:

  • Variable dependiente (Y): MEAN, tamaño de grano promedio.
  • Variable independiente (X1): MEDIAN, tamaño típico del grano.
  • Variable independiente (X2): STDEV, variación de los granos.

Estas variables se seleccionaron porque describen características complementarias de la distribución granulométrica. La variable MEAN representa el tamaño promedio del grano y se establece como respuesta del modelo. La variable MEDIAN aporta información sobre el tamaño central o típico de las partículas, mientras que STDEV expresa el grado de dispersión o variabilidad de los tamaños. En conjunto, permiten analizar cómo la posición central y la heterogeneidad de los granos influyen sobre su tamaño promedio.

# Definición de las variables del modelo.

# Las variables se convierten al tipo numérico para garantizar que puedan
# utilizarse posteriormente en el ajuste del modelo de regresión.
MEDIAN <- as.numeric(datos$MEDIAN)
STDEV <- as.numeric(datos$STDEV)
MEAN <- as.numeric(datos$MEAN)

variables_modelo <- data.frame(
  Variable = c("MEAN", "MEDIAN", "STDEV"),
  Rol = c("Dependiente", "Independiente", "Independiente"),
  Simbolo = c("Y", "X1", "X2")
)

#Tabla final
variables_modelo %>%
  gt() %>%
  tab_header(
    title = md("**Tabla N.°2. Variables seleccionadas para el modelo de regresión**")
  ) %>%
  cols_label(
    Variable = "Variable",
    Rol = "Rol en el modelo",
    Simbolo = "Símbolo"
  ) %>%
  cols_align(
    align = "center"
  ) %>%
  tab_options(
    table.width = pct(70),
    heading.align = "center",
    column_labels.font.weight = "bold"
  )
Tabla N.°2. Variables seleccionadas para el modelo de regresión
Variable Rol en el modelo Símbolo
MEAN Dependiente Y
MEDIAN Independiente X1
STDEV Independiente X2

3. TABLA DE PARES DE VALORES

La tabla de pares de valores se construye con las variables seleccionadas para el modelo de regresión lineal múltiple: MEAN como variable dependiente y MEDIAN y STDEV como variables independientes. Su finalidad es organizar cada observación en una misma fila, permitiendo analizar conjuntamente el tamaño promedio, el tamaño central y la dispersión de los granos. Esta tabla constituye la base para elaborar las gráficas de dispersión, identificar posibles relaciones entre las variables y comprobar que los datos sean adecuados antes de estimar los parámetros del modelo. Debido al elevado número de observaciones, se muestran únicamente las primeras filas junto con el tamaño total de la muestra.

# TABLA DE PARES DE VALORES
TPV <- data.frame(y = MEAN, x1 = MEDIAN, x2 = STDEV)

# Número inicial de observaciones
n_inicial <- nrow(TPV)

# Eliminar valores faltantes
TPV <- na.omit(TPV)
n_sin_na <- nrow(TPV)

TPV %>%
  head(10) %>%
  gt() %>%
  tab_header(
    title = md("**Tabla N.°4. Primeros pares de valores del modelo**"),
    subtitle = md(
      paste0(
        "Muestra final utilizada: **",
        format(nrow(TPV), big.mark = "."),
        " observaciones**"
      )
    )
  ) %>%
  cols_label(
    y = "MEAN (Y)",
    x1 = "MEDIAN (X1)",
    x2 = "STDEV (X2)"
  ) %>%
  fmt_number(
    columns = c(y, x1, x2),
    decimals = 3
  ) %>%
  cols_align(
    align = "center"
  ) %>%
  tab_options(
    table.width = pct(75),
    heading.align = "center",
    column_labels.font.weight = "bold"
  )
Tabla N.°4. Primeros pares de valores del modelo
Muestra final utilizada: 26.461 observaciones
MEAN (Y) MEDIAN (X1) STDEV (X2)
−0.540 −0.290 2.110
0.370 0.430 0.830
1.780 1.750 0.520
1.730 1.700 0.700
0.610 0.970 1.490
3.780 3.270 3.060
2.760 1.680 4.860
−1.740 −1.740 1.770
1.130 1.170 1.080
−0.690 −0.660 0.620

4. GRÁFICA DE DISPERSIÓN

El diagrama de dispersión permite observar gráficamente la relación entre la variable dependiente MEAN y las variables independientes MEDIAN y STDEV. Mediante la distribución de los puntos se puede identificar si existe una tendencia lineal, positiva o negativa, así como detectar concentraciones, valores atípicos o patrones que podrían afectar el ajuste del modelo. Este análisis visual constituye una etapa previa importante, ya que permite evaluar si la regresión lineal múltiple es adecuada y orientar la formulación inicial del modelo.

x1 <- TPV$x1
x2 <- TPV$x2
y <- TPV$y

Dispersion3D <- scatterplot3d(
  x1, x2, y,
  angle = 60,
  pch = 16,
  color = "blue",
  main = "Gráfica N°1: Diagrama de dispersión de MEAN, MEDIAN y STDEV",
  xlab = "MEDIAN",
  ylab = "STDEV",
  zlab = "MEAN"
)

5. CONJETURA DEL MODELO

Aunque en la Grafica de dispersion se puede visualizar el comportamiento de las variable Se realizara el Tratamiento de Datos para mejorarla un poco mas

Nueva Tabla de Pares de Valores

#TRATAMIENTO DE DATOS

TPV_limpia <- data.frame(
  y  = MEAN,
  x1 = MEDIAN,
  x2 = STDEV
)

# Cantidad inicial de observaciones
n_inicial <- nrow(TPV_limpia)

# Eliminar valores faltantes
TPV_limpia <- na.omit(TPV_limpia)
n_sin_na <- nrow(TPV_limpia)

# Conservar únicamente valores positivos
TPV_limpia <- TPV_limpia[
  TPV_limpia$y > 0 &
  TPV_limpia$x1 > 0 &
  TPV_limpia$x2 > 0,
]

n_positivos <- nrow(TPV_limpia)

#-----------------------------------------------------------------------------
# FUNCIÓN PARA IDENTIFICAR OBSERVACIONES DENTRO DE LOS LÍMITES IQR
#-----------------------------------------------------------------------------

filtro_iqr <- function(v) {
  Q1 <- quantile(v, 0.25, na.rm = TRUE)
  Q3 <- quantile(v, 0.75, na.rm = TRUE)
  rango_iqr <- Q3 - Q1

  limite_inferior <- Q1 - 1.5 * rango_iqr
  limite_superior <- Q3 + 1.5 * rango_iqr

  v >= limite_inferior & v <= limite_superior
}

# Aplicar el filtro simultáneamente a las tres variables
TPV_limpia <- TPV_limpia[
  filtro_iqr(TPV_limpia$y) &
  filtro_iqr(TPV_limpia$x1) &
  filtro_iqr(TPV_limpia$x2),
]

n_final <- nrow(TPV_limpia)

# Actualizar las variables que se utilizarán en el modelo
y  <- TPV_limpia$y
x1 <- TPV_limpia$x1
x2 <- TPV_limpia$x2

Tabla Resúmen

resumen_depuracion <- data.frame(
  Etapa = c(
    "Observaciones iniciales",
    "Después de eliminar valores faltantes",
    "Después de conservar valores positivos",
    "Después de aplicar el filtro IQR"
  ),
  Observaciones = c(
    n_inicial,
    n_sin_na,
    n_positivos,
    n_final
  )
)

resumen_depuracion %>%
  gt() %>%
  tab_header(
    title = md("**Tabla N.°4. Resumen del tratamiento de los datos depurada**")
  ) %>%
  cols_label(
    Etapa = "Etapa del procesamiento",
    Observaciones = "Número de observaciones"
  ) %>%
  cols_align(
    align = "left",
    columns = Etapa
  ) %>%
  cols_align(
    align = "center",
    columns = Observaciones
  ) %>%
  fmt_number(
    columns = Observaciones,
    decimals = 0,
    use_seps = TRUE
  ) %>%
  tab_options(
    table.width = pct(80),
    heading.align = "center",
    column_labels.font.weight = "bold"
  )
Tabla N.°4. Resumen del tratamiento de los datos depurada
Etapa del procesamiento Número de observaciones
Observaciones iniciales 27,784
Después de eliminar valores faltantes 26,461
Después de conservar valores positivos 24,945
Después de aplicar el filtro IQR 24,716

Nueva Grafica con Tratamiento

set.seed(42)

# Submuestra únicamente para mejorar la visualización
indice_visual <- sample(
  seq_len(nrow(TPV_limpia)),
  size = min(3000, nrow(TPV_limpia))
)

TPV_visual <- TPV_limpia[indice_visual, ]

scatterplot3d(
  x = TPV_visual$x1,
  y = TPV_visual$x2,
  z = TPV_visual$y,
  angle = 60,
  pch = 16,
  color = "blue",
  cex.symbols = 0.4,
  main = "Gráfica N.°2: Dispersión después del tratamiento",
  xlab = "MEDIAN",
  ylab = "STDEV",
  zlab = "MEAN"
)

Se propone un modelo de regresión lineal múltiple en el cual el tamaño promedio del grano, donde el tamaño de grano promedio (MEAN) depende del tamaño típico del grano (MEDIAN) y de la variación de los granos (STDEV).

\[Y = a + bX_1 + cX_2\]

Donde:

  • \(Y\) representa MEAN.
  • \(X_1\) representa MEDIAN.
  • \(X_2\) representa STDEV.
  • \(a\), \(b\) y \(c\) son los parámetros del modelo.

6. CÁLCULO DE PARÁMETROS

# AJUSTE DEL MODELO

regresion_multiple <- lm(
  y ~ x1 + x2,
  data = TPV_limpia
)

resumen_modelo <- summary(regresion_multiple)
valores_predichos <- predict(regresion_multiple)

coeficientes <- coef(regresion_multiple)

a <- coeficientes[1]
b <- coeficientes[2]
c <- coeficientes[3]
tabla_coeficientes <- data.frame(
  Parámetro = c(
    "Intercepto (a)",
    "MEDIAN (b)",
    "STDEV (c)"
  ),
  Estimación = coeficientes,
  Error_estándar = resumen_modelo$coefficients[, 2],
  Estadístico_t = resumen_modelo$coefficients[, 3],
  Valor_p = resumen_modelo$coefficients[, 4]
)

tabla_coeficientes %>%
  gt() %>%
  tab_header(
    title = md("**Tabla N.°5. Parámetros estimados del modelo**")
  ) %>%
  cols_label(
    Parámetro = "Parámetro",
    Estimación = "Estimación",
    Error_estándar = "Error estándar",
    Estadístico_t = "Estadístico t",
    Valor_p = "Valor p"
  ) %>%
  fmt_number(
    columns = c(
      Estimación,
      Error_estándar,
      Estadístico_t
    ),
    decimals = 4
  ) %>%
  fmt_scientific(
    columns = Valor_p,
    decimals = 3
  ) %>%
  cols_align(
    align = "center"
  ) %>%
  tab_options(
    table.width = pct(90),
    heading.align = "center",
    column_labels.font.weight = "bold"
  )
Tabla N.°5. Parámetros estimados del modelo
Parámetro Estimación Error estándar Estadístico t Valor p
Intercepto (a) 0.1418 0.0127 11.1846 5.697 × 10−29
MEDIAN (b) 0.8979 0.0022 407.0311 0.000
STDEV (c) 0.2138 0.0072 29.5818 5.050 × 10−189
signo_b <- ifelse(b >= 0, "+", "-")
signo_c <- ifelse(c >= 0, "+", "-")

ecuacion <- paste0(
  "MEAN = ",
  round(a, 4), " ",
  signo_b, " ",
  abs(round(b, 4)), "·MEDIAN ",
  signo_c, " ",
  abs(round(c, 4)), "·STDEV"
)

plot(
  1,
  type = "n",
  axes = FALSE,
  xlab = "",
  ylab = ""
)

text(
  x = 1,
  y = 1,
  labels = paste(
    "Modelo de regresión lineal múltiple\n\n",
    ecuacion
  ),
  cex = 1.7,
  col = "blue",
  font = 2
)

7. REALIDAD Y MODELO

En esta gráfica, los puntos representan los valores reales observados y el plano representa los valores estimados por el modelo de regresión. Mientras más próximos se encuentren los puntos al plano, mayor será la capacidad del modelo para representar el comportamiento de los datos.

grafica_modelo <- scatterplot3d(
  x = TPV_visual$x1,
  y = TPV_visual$x2,
  z = TPV_visual$y,
  angle = 60,
  pch = 16,
  color = "blue",
  cex.symbols = 0.4,
  main = "Gráfica N.°3: Realidad y modelo lineal",
  xlab = "MEDIAN",
  ylab = "STDEV",
  zlab = "MEAN"
)

grafica_modelo$plane3d(
  regresion_multiple,
  draw_polygon = TRUE,
  draw_lines = TRUE
)

8. TEST DE PEARSON

#-----------------------------------------------------------------------------
# TEST DE PEARSON
#-----------------------------------------------------------------------------

pearson_median <- cor.test(
  TPV_limpia$y,
  TPV_limpia$x1,
  method = "pearson"
)

pearson_stdev <- cor.test(
  TPV_limpia$y,
  TPV_limpia$x2,
  method = "pearson"
)

#-----------------------------------------------------------------------------
# TABLA DE RESULTADOS DE PEARSON
#-----------------------------------------------------------------------------

resultados_pearson <- data.frame(
  Relación = c(
    "MEAN y MEDIAN",
    "MEAN y STDEV"
  ),
  Coeficiente_r = c(
    unname(pearson_median$estimate),
    unname(pearson_stdev$estimate)
  ),
  Valor_p = c(
    pearson_median$p.value,
    pearson_stdev$p.value
  )
)

resultados_pearson %>%
  gt() %>%
  tab_header(
    title = md("**Tabla N.°6. Prueba de correlación de Pearson**")
  ) %>%
  cols_label(
    Relación = "Variables relacionadas",
    Coeficiente_r = "Coeficiente de Pearson (r)",
    Valor_p = "Valor p"
  ) %>%
  fmt_number(
    columns = Coeficiente_r,
    decimals = 4
  ) %>%
  fmt_scientific(
    columns = Valor_p,
    decimals = 3
  ) %>%
  cols_align(
    align = "center"
  ) %>%
  tab_options(
    table.width = pct(80),
    heading.align = "center",
    column_labels.font.weight = "bold"
  )
Tabla N.°6. Prueba de correlación de Pearson
Variables relacionadas Coeficiente de Pearson (r) Valor p
MEAN y MEDIAN 0.9422 0.000
MEAN y STDEV 0.4051 0.000
cat("### Interpretación de la prueba de Pearson\n\n")
## ### Interpretación de la prueba de Pearson
cat(
  paste0(
    "La relación entre **MEAN y MEDIAN** presenta un coeficiente de Pearson de **",
    round(unname(pearson_median$estimate), 4),
    "**. "
  )
)
## La relación entre **MEAN y MEDIAN** presenta un coeficiente de Pearson de **0.9422**.
if (pearson_median$p.value < 0.05) {
  cat(
    "Como el valor p es inferior a 0,05, se concluye que existe una relación lineal estadísticamente significativa entre ambas variables.\n\n"
  )
} else {
  cat(
    "Como el valor p es mayor o igual a 0,05, no existe evidencia suficiente para afirmar que haya una relación lineal estadísticamente significativa entre ambas variables.\n\n"
  )
}
## Como el valor p es inferior a 0,05, se concluye que existe una relación lineal estadísticamente significativa entre ambas variables.
cat(
  paste0(
    "La relación entre **MEAN y STDEV** presenta un coeficiente de Pearson de **",
    round(unname(pearson_stdev$estimate), 4),
    "**. "
  )
)
## La relación entre **MEAN y STDEV** presenta un coeficiente de Pearson de **0.4051**.
if (pearson_stdev$p.value < 0.05) {
  cat(
    "Como el valor p es inferior a 0,05, se concluye que existe una relación lineal estadísticamente significativa entre ambas variables.\n\n"
  )
} else {
  cat(
    "Como el valor p es mayor o igual a 0,05, no existe evidencia suficiente para afirmar que haya una relación lineal estadísticamente significativa entre ambas variables.\n\n"
  )
}
## Como el valor p es inferior a 0,05, se concluye que existe una relación lineal estadísticamente significativa entre ambas variables.

9. RESTRICCIONES

Las restricciones del modelo se establecen a partir de los dominios observados de las variables independientes MEDIAN y STDEV, del dominio observado de la variable dependiente MEAN y de la interpretacion correcta de la escala granulometrica \(\Phi\).

Dominio de X1

La variable independiente \(X_1=\text{MEDIAN}\) representa la mediana granulometrica expresada en unidades \(\Phi\). Para evitar extrapolaciones, las estimaciones deben realizarse dentro del intervalo utilizado para ajustar el modelo.

dominio_x1 <- range(TPV_limpia$x1, na.rm = TRUE)
x1min <- dominio_x1[1]
x1max <- dominio_x1[2]

cat(
  "Dominio observado de X1:",
  round(x1min, 4), "<= MEDIAN <=",
  round(x1max, 4), "Phi\n"
)
## Dominio observado de X1: 0.01 <= MEDIAN <= 11.9051 Phi

Por tanto, el dominio recomendado para MEDIAN es:

\[ D_{X_1}=[\,0.01,\;11.9051\,]. \]

Dominio de X2

La variable independiente \(X_2=\text{STDEV}\) representa la desviacion estandar granulometrica. Su aplicacion tambien se limita al intervalo observado en la muestra depurada.

dominio_x2 <- range(TPV_limpia$x2, na.rm = TRUE)
x2min <- dominio_x2[1]
x2max <- dominio_x2[2]

cat(
  "Dominio observado de X2:",
  round(x2min, 4), "<= STDEV <=",
  round(x2max, 4), "Phi\n"
)
## Dominio observado de X2: 0.0039 <= STDEV <= 3.9011 Phi

En consecuencia:

\[ D_{X_2}=[\,0.0039,\;3.9011\,]. \]

Dominio de Y

La variable dependiente \(Y=\text{MEAN}\) corresponde al tamaño medio del grano expresado en unidades \(\Phi\). Su dominio observado se obtiene de los valores empleados en el ajuste.

dominio_y <- range(TPV_limpia$y, na.rm = TRUE)
ymin <- dominio_y[1]
ymax <- dominio_y[2]

cat(
  "Dominio observado de Y:",
  round(ymin, 4), "<= MEAN <=",
  round(ymax, 4), "Phi\n"
)
## Dominio observado de Y: 0.01 <= MEAN <= 11.3386 Phi

Por tanto:

\[ D_Y=[\,0.01,\;11.3386\,]. \]

11. CONCLUSIÓN

Entre el tamaño promedio del grano (MEAN) y la combinación de la mediana granulométrica (MEDIAN) y la desviación estándar (STDEV) existe una relación lineal múltiple, representada por el modelo MEAN = 0.1418 + 0.8979 · MEDIAN + 0.2138 · STDEV, siendo Y = MEAN la variable dependiente, X1 = MEDIAN y X2 = STDEV las variables independientes.

El modelo es válido dentro de los dominios observados 0.01 ≤ MEDIAN ≤ 11.9051 y 0.0039 ≤ STDEV ≤ 3.9011.

El modelo explica aproximadamente el 89.15 % de la variabilidad observada en el tamaño promedio del grano, mientras que el 10.85 % restante se atribuye a otros factores sedimentológicos no incluidos en el modelo.