1. CARGA DE DATOS Y LIBRERÍAS

library(dplyr)
library(knitr)
library(gt)

datos <- read.csv(
  paste0(
    "C:/Users/Grace/OneDrive/Escritorio/Proyecto Estadistica/",
    "data_limpio_80v/texture.csv"
  ),
  header = TRUE,
  sep = ",",
  dec = ".",
  stringsAsFactors = FALSE
)

data.frame(
  Descripción = c("Número de observaciones", "Número de variables"),
  Valor = c(nrow(datos), ncol(datos))
) %>%
  gt() %>%
  tab_header(
    title = md("**Tabla N.° 1. Resumen del conjunto de datos**")
  ) %>%
  cols_align(align = "center")
Tabla N.° 1. Resumen del conjunto de datos
Descripción Valor
Número de observaciones 27784
Número de variables 58

2. SELECCIÓN DE VARIABLES

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

tabla_variables <- data.frame(
  Rol = c("Variable independiente (X)", "Variable dependiente (Y)"),
  Variable = c("SAND_PCT", "KURTOSIS"),
  Descripción = c(
    "Porcentaje de arena (%)",
    "Curtosis de la distribución granulométrica"
  )
)

tabla_variables %>%
  gt() %>%
  tab_header(
    title = md("**Tabla N.° 2. Variables seleccionadas**"),
    subtitle = "Modelo de regresión polinómica"
  ) %>%
  cols_align(align = "center")
Tabla N.° 2. Variables seleccionadas
Modelo de regresión polinómica
Rol Variable Descripción
Variable independiente (X) SAND_PCT Porcentaje de arena (%)
Variable dependiente (Y) KURTOSIS Curtosis de la distribución granulométrica

La variable independiente SAND_PCT representa el porcentaje de arena presente en cada muestra, mientras que la variable dependiente KURTOSIS describe el grado de concentración y el comportamiento de las colas de la distribución granulométrica. La dirección planteada es físicamente defendible porque un cambio en la proporción de arena modifica la composición de tamaños de grano y, por tanto, puede influir en la forma de su distribución. Esta relación expresa una influencia estadística coherente, pero no demuestra por sí sola causalidad experimental.

3. TABLA DE PARES DE VALORES

Antes de ajustar el modelo de regresión polinómica, es necesario verificar que el conjunto de datos contenga información válida, consistente y representativa del fenómeno estudiado. Para ello, se construye la tabla de pares, se excluyen registros inválidos y duplicados exactos, y posteriormente se identifican valores atípicos extremos. Este procedimiento permite estimar el modelo con pares de valores confiables y reduce la influencia de errores de registro sobre la forma de la curva.

3.1 Construcción de la tabla de pares de valores

El conjunto de datos contiene numerosas variables granulométricas; sin embargo, para este modelo únicamente se requieren la variable independiente SAND_PCT y la variable dependiente KURTOSIS. Por esta razón, se construye una tabla que contiene exclusivamente los pares correspondientes al porcentaje de arena y a la curtosis granulométrica.

#==============================================================================
# 3.1 CONSTRUCCIÓN DE LA TABLA DE PARES DE VALORES
#==============================================================================

# X = SAND_PCT -> Porcentaje de arena presente en cada muestra.
# Y = KURTOSIS -> Curtosis de la distribución granulométrica.

TPV <- data.frame(
  SAND_PCT = as.numeric(datos$SAND_PCT),
  KURTOSIS = as.numeric(datos$KURTOSIS)
)

# Registrar el número inicial de observaciones.
n_original <- nrow(TPV)

cat("Número inicial de observaciones:", n_original)
## Número inicial de observaciones: 27784

3.2 Verificación y exclusión de datos inválidos

Una vez construida la tabla, se excluyen los registros con valores faltantes, infinitos o inconsistentes, porque pueden afectar la estimación de los parámetros. Como SAND_PCT representa un porcentaje, únicamente se aceptan valores entre 0 % y 100 %. A diferencia de una regresión logarítmica, en este modelo polinómico sí puede conservarse SAND_PCT = 0, porque no se aplica la transformación \(\log(X)\). También se excluye el código -9999, utilizado para representar información ausente.

#==============================================================================
# 3.2 VERIFICACIÓN Y EXCLUSIÓN DE DATOS INVÁLIDOS
#==============================================================================

# Identificar registros con valores faltantes.
n_na <- sum(!complete.cases(TPV))

# Conservar únicamente observaciones válidas.
TPV_valida <- TPV %>%
  filter(
    !is.na(SAND_PCT),
    !is.na(KURTOSIS),
    is.finite(SAND_PCT),
    is.finite(KURTOSIS),
    SAND_PCT != -9999,
    KURTOSIS != -9999,
    SAND_PCT >= 0,
    SAND_PCT <= 100
  )

n_validos <- nrow(TPV_valida)
n_invalidos <- n_original - n_validos

cat("Observaciones válidas:", n_validos, "\n")
## Observaciones válidas: 24427
cat("Observaciones excluidas:", n_invalidos)
## Observaciones excluidas: 3357

3.3 Identificación y exclusión de duplicados exactos

Un mismo porcentaje de arena puede presentar diferentes valores de curtosis y esas observaciones no deben eliminarse, porque representan la variabilidad natural de las muestras. Por ello, no se promedian todas las observaciones que comparten un valor de SAND_PCT; únicamente se excluyen los pares exactamente duplicados, es decir, aquellos que repiten simultáneamente el mismo valor de SAND_PCT y de KURTOSIS. De esta manera se evita otorgar un peso adicional a registros idénticos sin modificar la tendencia original.

#==============================================================================
# 3.3 IDENTIFICACIÓN Y EXCLUSIÓN DE DUPLICADOS EXACTOS
#==============================================================================

TPV_sin_duplicados <- TPV_valida %>%
  distinct(SAND_PCT, KURTOSIS, .keep_all = TRUE)

n_sin_duplicados <- nrow(TPV_sin_duplicados)
n_duplicados <- n_validos - n_sin_duplicados

cat("Observaciones después de excluir duplicados:", n_sin_duplicados, "\n")
## Observaciones después de excluir duplicados: 23894
cat("Duplicados exactos excluidos:", n_duplicados)
## Duplicados exactos excluidos: 533

3.4 Identificación y exclusión de valores atípicos mediante residuos studentizados

Para identificar únicamente las observaciones extremadamente alejadas de la tendencia, se ajusta un modelo polinómico preliminar de tercer grado y se calculan sus residuos studentizados. Se excluyen los pares cuyo residuo studentizado tiene un valor absoluto superior a 3. Este criterio es conservador: elimina registros con una discrepancia extrema respecto al modelo preliminar, pero mantiene la dispersión natural de los datos geológicos. El tratamiento se aplica exclusivamente a SAND_PCT y KURTOSIS y no modifica manualmente ningún valor.

#==============================================================================
# 3.4 IDENTIFICACIÓN Y EXCLUSIÓN DE VALORES ATÍPICOS
#     MEDIANTE RESIDUOS STUDENTIZADOS
#==============================================================================

# Ajustar un modelo preliminar con el mismo grado del modelo definitivo.
modelo_base <- lm(
  KURTOSIS ~ SAND_PCT + I(SAND_PCT^2) + I(SAND_PCT^3),
  data = TPV_sin_duplicados
)

# Calcular los residuos studentizados.
TPV_con_residuos <- TPV_sin_duplicados %>%
  mutate(residuo_student = rstudent(modelo_base))

# Conservar las observaciones con |residuo studentizado| <= 3.
TPV_final <- TPV_con_residuos %>%
  filter(
    !is.na(residuo_student),
    abs(residuo_student) <= 3
  ) %>%
  select(-residuo_student) %>%
  arrange(SAND_PCT)

n_final <- nrow(TPV_final)
n_outliers <- n_sin_duplicados - n_final
porcentaje_outliers <- 100 * n_outliers / n_sin_duplicados
porcentaje_eliminado <- 100 * (n_original - n_final) / n_original

cat("Observaciones utilizadas en el modelo:", n_final, "\n")
## Observaciones utilizadas en el modelo: 23382
cat("Observaciones atípicas extremas excluidas:", n_outliers, "\n")
## Observaciones atípicas extremas excluidas: 512
cat("Porcentaje de outliers extremos:", round(porcentaje_outliers, 2), "%")
## Porcentaje de outliers extremos: 2.14 %

3.5 Conjunto final de pares de valores

Después de la validación, exclusión de duplicados y depuración se obtiene el conjunto final de pares que se utilizará para construir el diagrama de dispersión y ajustar el modelo polinómico de tercer grado. La tabla presenta las primeras 20 observaciones para facilitar su lectura, aunque el modelo utiliza la totalidad de los pares contenidos en TPV_final.

#==============================================================================
# 3.5 CONJUNTO FINAL DE PARES DE VALORES
#==============================================================================

tabla_depuracion <- data.frame(
  Etapa = c(
    "Datos originales",
    "Registros inválidos excluidos",
    "Duplicados exactos excluidos",
    "Outliers extremos excluidos (|residuo studentizado| > 3)",
    "Datos finales utilizados en la regresión"
  ),
  Registros = c(
    n_original,
    n_invalidos,
    n_duplicados,
    n_outliers,
    n_final
  )
)

tabla_depuracion %>%
  gt() %>%
  cols_label(
    Etapa = "Etapa del tratamiento",
    Registros = "Número de registros"
  ) %>%
  tab_header(
    title = md("**Tabla N.° 3. Resumen del tratamiento de datos**"),
    subtitle = paste0(
      "Registros antes: ", n_original,
      "; registros después: ", n_final,
      "; porcentaje total excluido: ",
      round(porcentaje_eliminado, 2), "%"
    )
  ) %>%
  cols_align(align = "center") %>%
  tab_options(
    table.width = pct(90),
    column_labels.font.weight = "bold"
  )
Tabla N.° 3. Resumen del tratamiento de datos
Registros antes: 27784; registros después: 23382; porcentaje total excluido: 15.84%
Etapa del tratamiento Número de registros
Datos originales 27784
Registros inválidos excluidos 3357
Duplicados exactos excluidos 533
Outliers extremos excluidos (|residuo studentizado| > 3) 512
Datos finales utilizados en la regresión 23382
TPV_tabla <- TPV_final %>%
  mutate(Nro = row_number()) %>%
  select(Nro, everything())

head(TPV_tabla, 20) %>%
  gt() %>%
  cols_label(
    Nro = "N.°",
    SAND_PCT = "SAND_PCT (%)",
    KURTOSIS = "KURTOSIS"
  ) %>%
  tab_header(
    title = md(
      "**Tabla N.° 4. Conjunto final de pares utilizados para el ajuste del modelo polinómico.**"
    )
  ) %>%
  fmt_number(
    columns = c(SAND_PCT, KURTOSIS),
    decimals = 4
  ) %>%
  cols_align(align = "center") %>%
  tab_options(
    table.width = pct(90),
    column_labels.font.weight = "bold"
  )
Tabla N.° 4. Conjunto final de pares utilizados para el ajuste del modelo polinómico.
N.° SAND_PCT (%) KURTOSIS
1 0.0000 0.0200
2 0.0000 −0.4000
3 0.0000 −0.3700
4 0.0000 0.5000
5 0.0000 −0.2700
6 0.0000 −0.5900
7 0.0000 −0.3300
8 0.0000 −0.6700
9 0.0000 −0.4400
10 0.0000 −0.6500
11 0.0000 −0.3200
12 0.0000 −0.4800
13 0.0000 −0.8100
14 0.0000 0.5900
15 0.0000 −0.5500
16 0.0000 0.0000
17 0.0000 −19.5800
18 0.0000 −1.9600
19 0.0000 −2.0700
20 0.0000 −1.2600
# Definir las variables finales del modelo.
x <- TPV_final$SAND_PCT
y <- TPV_final$KURTOSIS

4. DIAGRAMA DE DISPERSIÓN

4.1 Nube de dispersión antes del tratamiento

La primera gráfica permite observar el comportamiento inicial de las variables. Para evitar que los códigos de ausencia destruyan la escala visual, se representan los pares numéricos finitos distintos de -9999, pero todavía no se aplican las restricciones físicas, la exclusión de duplicados ni el tratamiento mediante residuos studentizados.

TPV_grafica_original <- TPV %>%
  filter(
    !is.na(SAND_PCT),
    !is.na(KURTOSIS),
    is.finite(SAND_PCT),
    is.finite(KURTOSIS),
    SAND_PCT != -9999,
    KURTOSIS != -9999
  )

set.seed(2026)
indice_original <- sample(
  seq_len(nrow(TPV_grafica_original)),
  min(3000, nrow(TPV_grafica_original))
)

plot(
  TPV_grafica_original$SAND_PCT[indice_original],
  TPV_grafica_original$KURTOSIS[indice_original],
  pch = 16,
  cex = 0.65,
  col = rgb(0, 0, 1, 0.32),
  main = "Gráfica N.° 1. Datos originales antes del tratamiento",
  xlab = "SAND_PCT (porcentaje de arena, %)",
  ylab = "KURTOSIS (curtosis granulométrica)"
)
grid()

La nube original presenta una dispersión elevada e incorpora valores físicamente inconsistentes, duplicados y observaciones extremas. Por ello, esta gráfica se utiliza como diagnóstico inicial y no como base directa para formular el modelo definitivo.

4.2 Nube de dispersión después del tratamiento

La siguiente gráfica utiliza el conjunto final depurado. Para mejorar la legibilidad se representa una muestra reproducible de hasta 3000 puntos; esta selección afecta únicamente a la visualización, pues el ajuste utiliza la totalidad de las observaciones contenidas en TPV_final.

set.seed(2026)
indice_visual <- sample(
  seq_along(x),
  min(3000, length(x))
)

plot(
  x[indice_visual],
  y[indice_visual],
  pch = 16,
  cex = 0.65,
  col = rgb(0, 0, 1, 0.32),
  main = "Gráfica N.° 2. Dispersión tratada entre Arena y KURTOSIS",
  xlab = "SAND_PCT (porcentaje de arena, %)",
  ylab = "KURTOSIS (curtosis granulométrica)"
)
grid()

Después del tratamiento se distingue con mayor claridad la tendencia predominante, sin eliminar la variabilidad natural propia de las muestras de sedimentos marinos.

5. CONJETURA DEL MODELO

En la nube tratada se observa que la curtosis cambia de forma no lineal conforme aumenta el porcentaje de arena. La tendencia presenta cambios de pendiente y curvatura que una recta o una función logarítmica monótona no representarían adecuadamente. Por ello, se plantea como conjetura un modelo polinómico de tercer grado:

\[ Y=\beta_0+\beta_1X+\beta_2X^2+\beta_3X^3. \]

6. PARÁMETROS DEL MODELO

modelo_polinomico <- lm(
  KURTOSIS ~ SAND_PCT + I(SAND_PCT^2) + I(SAND_PCT^3),
  data = TPV_final
)

coeficientes <- coef(modelo_polinomico)
beta0 <- coeficientes[1]
beta1 <- coeficientes[2]
beta2 <- coeficientes[3]
beta3 <- coeficientes[4]

tabla_parametros <- data.frame(
  Parámetro = c(
    "Término independiente (β0)",
    "Coeficiente lineal (β1)",
    "Coeficiente cuadrático (β2)",
    "Coeficiente cúbico (β3)"
  ),
  Valor = c(beta0, beta1, beta2, beta3)
)

tabla_parametros %>%
  gt() %>%
  fmt_number(columns = Valor, decimals = 6) %>%
  tab_header(
    title = md("**Tabla N.° 5. Parámetros del modelo polinómico**")
  ) %>%
  cols_align(align = "center")
Tabla N.° 5. Parámetros del modelo polinómico
Parámetro Valor
Término independiente (β0) −0.466701
Coeficiente lineal (β1) 0.228159
Coeficiente cuadrático (β2) −0.009229
Coeficiente cúbico (β3) 0.000088

Ecuación del modelo

ecuacion <- paste0(
  "KURTOSIS = ", round(beta0, 4),
  ifelse(beta1 >= 0, " + ", " - "),
  round(abs(beta1), 4), " · SAND_PCT",
  ifelse(beta2 >= 0, " + ", " - "),
  round(abs(beta2), 4), " · SAND_PCT²",
  ifelse(beta3 >= 0, " + ", " - "),
  round(abs(beta3), 4), " · SAND_PCT³"
)

ecuacion_grafica_1 <- paste0(
  "KURTOSIS = ", round(beta0, 4),
  ifelse(beta1 >= 0, " + ", " - "),
  round(abs(beta1), 4), " · SAND_PCT",
  ifelse(beta2 >= 0, " + ", " - "),
  round(abs(beta2), 4), " · SAND_PCT²"
)

ecuacion_grafica_2 <- paste0(
  ifelse(beta3 >= 0, "+ ", "- "),
  round(abs(beta3), 4), " · 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,
  "KURTOSIS = β0 + β1·SAND_PCT + β2·SAND_PCT² + β3·SAND_PCT³",
  font = 2, cex = 0.85, col = "#C0392B"
)

rect(5, 8, 95, 48, border = "#1F4E79", lwd = 3)
text(
  50, 43, "MODELO POLINÓMICO AJUSTADO",
  font = 2, cex = 1.35, col = "#1F4E79"
)
text(
  50, 29, ecuacion_grafica_1,
  font = 2, cex = 0.98, col = "#C0392B"
)
text(
  50, 19, ecuacion_grafica_2,
  font = 2, cex = 0.98, col = "#C0392B"
)
text(
  50, 3,
  "Ecuación obtenida mediante mínimos cuadrados ordinarios.",
  cex = 0.85, col = "gray40"
)
box()

7. REALIDAD Y MODELO

x_modelo <- seq(min(x), max(x), length.out = 400)
y_modelo <- predict(
  modelo_polinomico,
  newdata = data.frame(SAND_PCT = x_modelo)
)

plot(
  x[indice_visual],
  y[indice_visual],
  pch = 16,
  cex = 0.60,
  col = rgb(0, 0, 1, 0.35),
  main = "Gráfica N.° 3. Realidad y modelo polinómico",
  xlab = "SAND_PCT (porcentaje de arena, %)",
  ylab = "KURTOSIS (curtosis granulométrica)"
)
lines(x_modelo, y_modelo, col = "red3", lwd = 3)
grid()
legend(
  "bottomright",
  legend = c("Realidad observada", "Modelo polinómico"),
  pch = c(16, NA),
  lty = c(NA, 1),
  lwd = c(NA, 3),
  col = c(rgb(0, 0, 1, 0.35), "red3"),
  bty = "n"
)

La curva polinómica representa la tendencia general entre el porcentaje de arena y la curtosis granulométrica. Las diferencias entre los puntos y el modelo corresponden a la variabilidad natural y a otros componentes granulométricos no incluidos.

8. TESTS DE APROBACIÓN

y_estimado <- predict(modelo_polinomico)
r <- cor(y, y_estimado, method = "pearson")
R2 <- summary(modelo_polinomico)$r.squared

decision_pearson <- ifelse(r >= 0.70, "APRUEBA", "NO APRUEBA")

tabla_tests <- data.frame(
  Indicador = c(
    "Correlación de Pearson",
    "Coeficiente de determinación"
  ),
  Resultado = c(
    paste0(
      "r = ", round(r, 4),
      " (", round(r * 100, 2), " %)"
    ),
    paste0(
      "R² = ", round(R2, 4),
      " (", round(R2 * 100, 2), " %)"
    )
  ),
  Interpretación = c(
    decision_pearson,
    "Capacidad explicativa del modelo"
  )
)

tabla_tests %>%
  gt() %>%
  tab_header(
    title = md("**Tabla N.° 6. Evaluación del modelo polinómico**")
  ) %>%
  cols_align(align = "center") %>%
  tab_style(
    style = cell_text(weight = "bold"),
    locations = cells_body(columns = Interpretación, rows = 1)
  )
Tabla N.° 6. Evaluación del modelo polinómico
Indicador Resultado Interpretación
Correlación de Pearson r = 0.757 (75.7 %) APRUEBA
Coeficiente de determinación R² = 0.5731 (57.31 %) Capacidad explicativa del modelo

El coeficiente de Pearson mide la correspondencia entre los valores observados y estimados. El coeficiente \(R^2\) indica qué proporción de la variabilidad de KURTOSIS es explicada por SAND_PCT mediante el modelo polinómico de tercer grado.

9. RESTRICCIONES DEL MODELO

Dominio de X

SAND_PCT representa un porcentaje, por lo que físicamente debe encontrarse entre 0 % y 100 %. Para evitar extrapolaciones, el modelo se aplica dentro del intervalo realmente observado en TPV_final.

xmin <- min(x, na.rm = TRUE)
xmax <- max(x, na.rm = TRUE)

cat(
  "Dominio observado de X:",
  round(xmin, 4), "<= SAND_PCT <=",
  round(xmax, 4), "%\n"
)
## Dominio observado de X: 0 <= SAND_PCT <= 100 %

Dominio de Y

KURTOSIS describe la forma de la distribución granulométrica. Cuando se trabaja con curtosis en exceso, los valores negativos son estadísticamente válidos e indican una distribución más aplanada que la normal; por ello, no se impone la condición \(Y\geq 0\). Su dominio se limita al intervalo observado en las muestras utilizadas.

ymin <- min(y, na.rm = TRUE)
ymax <- max(y, na.rm = TRUE)

cat(
  "Dominio observado de Y:",
  round(ymin, 4), "<= KURTOSIS <=",
  round(ymax, 4), "\n"
)
## Dominio observado de Y: -19.58 <= KURTOSIS <= 40.95

Pregunta de restricción

Debido a que el modelo debe utilizarse dentro de los valores respaldados por los datos, se plantea la siguiente pregunta:

¿Para qué valores de SAND_PCT la ecuación cúbica produce estimaciones de KURTOSIS dentro del intervalo observado?

La condición se expresa como:

\[ y_{\min}\leq \beta_0+\beta_1X+\beta_2X^2+\beta_3X^3 \leq y_{\max}. \]

Cálculo de la restricción utilizando la ecuación

# Evaluar la ecuación cúbica en todo el dominio observado de SAND_PCT.
x_verificacion <- seq(xmin, xmax, length.out = 2000)
y_verificacion <- predict(
  modelo_polinomico,
  newdata = data.frame(SAND_PCT = x_verificacion)
)

prediccion_en_dominio <- (
  y_verificacion >= ymin &
  y_verificacion <= ymax
)

cat(
  "¿Las estimaciones permanecen dentro del dominio observado de KURTOSIS?",
  ifelse(all(prediccion_en_dominio), "Sí", "No"),
  "\n"
)
## ¿Las estimaciones permanecen dentro del dominio observado de KURTOSIS? Sí

La sustitución de los valores de SAND_PCT en la ecuación confirma si las estimaciones permanecen dentro del rango de KURTOSIS utilizado en el ajuste. Los valores negativos de KURTOSIS no son inválidos por sí mismos cuando se trabaja con curtosis en exceso. Por ello, la restricción consiste en mantener las estimaciones dentro de los dominios observados y evitar extrapolaciones.

Restricción final del modelo

if (all(prediccion_en_dominio)) {
  restriccion_final <- paste0(
    round(xmin, 4),
    " <= SAND_PCT <= ",
    round(xmax, 4),
    " %"
  )
} else {
  indices_validos <- which(prediccion_en_dominio)
  restriccion_final <- paste0(
    round(min(x_verificacion[indices_validos]), 4),
    " <= SAND_PCT <= ",
    round(max(x_verificacion[indices_validos]), 4),
    " %"
  )
}

plot.new()
plot.window(xlim = c(0, 100), ylim = c(0, 100))
rect(5, 18, 95, 82, border = "#1F4E79", lwd = 3)
text(
  50, 72, "RESTRICCIÓN FINAL DEL MODELO",
  cex = 1.40, font = 2, col = "#1F4E79"
)
text(
  50, 51, restriccion_final,
  cex = 1.32, font = 2, col = "#C0392B"
)
text(
  50, 32, "Intervalo observado recomendado",
  cex = 0.95, col = "gray40"
)
text(
  50, 26, "para evitar extrapolaciones.",
  cex = 0.88, col = "gray40"
)
box()

10. ESTIMACIÓN MEDIANTE EL MODELO

Se estima KURTOSIS para una muestra con SAND_PCT = 60 %, valor que pertenece al dominio observado.

x_estimacion <- 60
y_estimacion <- predict(
  modelo_polinomico,
  newdata = data.frame(SAND_PCT = x_estimacion)
)

plot.new()
plot.window(xlim = c(0, 100), ylim = c(0, 100))
rect(5, 18, 95, 82, border = "#1F4E79", lwd = 3)
text(
  50, 72, "ESTIMACIÓN DEL MODELO POLINÓMICO",
  cex = 1.32, font = 2, col = "#1F4E79"
)
text(
  50, 56,
  paste0("Para SAND_PCT = ", x_estimacion, " %"),
  cex = 1.10
)
text(
  50, 40,
  paste0("KURTOSIS estimada = ", round(y_estimacion, 4)),
  cex = 1.55, font = 2, col = "#C0392B"
)
text(
  50, 25,
  "Estimación realizada dentro del dominio observado.",
  cex = 0.88, col = "gray40"
)
box()

11. CONCLUSIÓN

Entre la curtosis granulométrica (KURTOSIS) y el porcentaje de arena (SAND_PCT) existe una relación no lineal de tipo polinómico de tercer grado, cuyo modelo matemático es KURTOSIS = -0.4667 + 0.2282 · SAND_PCT - 0.0092 · SAND_PCT² + 1e-04 · SAND_PCT³, siendo \(Y=\text{KURTOSIS}\) la variable dependiente y \(X=\text{SAND\_PCT}\) la variable independiente. El modelo presenta restricciones y debe utilizarse únicamente dentro del intervalo 0 \(\leq X\leq\) 100 %, correspondiente al dominio observado del porcentaje de arena; fuera de este intervalo sus resultados serían extrapolaciones.