1. Carga de librerías y datos

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
setwd("/cloud/project")

datos <- read.csv("china_water_pollution_data.csv",
                  header = TRUE, sep = ",", dec = ".")

2. Seleccionar variables correctas y Depuración

datos_sel <- datos %>%
  select(Total_Nitrogen_mg_L, Turbidity_NTU)

# 2.1 Función para eliminar atípicos (IQR)
quitar_atipicos_IQR <- function(x) {
  Q1 <- quantile(x, 0.25, na.rm = TRUE)
  Q3 <- quantile(x, 0.75, na.rm = TRUE)
  IQR <- Q3 - Q1
  x >= (Q1 - 1.5 * IQR) & x <= (Q3 + 1.5 * IQR)
}

# 2.2 Eliminar atípicos
datos_limpios <- datos_sel[
  quitar_atipicos_IQR(datos_sel$Total_Nitrogen_mg_L) &
    quitar_atipicos_IQR(datos_sel$Turbidity_NTU),
]

# 2.1 Crear bins de Nitrógeno Total
datos_binned <- datos_limpios %>%
  mutate(
    TN_BIN = cut(
      Total_Nitrogen_mg_L,
      breaks = seq(
        floor(min(Total_Nitrogen_mg_L)),
        ceiling(max(Total_Nitrogen_mg_L)),
        by = 0.5
      )
    )
  )

# 2.2 Medianas por bin
datos_resumen <- datos_binned %>%
  group_by(TN_BIN) %>%
  summarise(
    Total_Nitrogen_mg_L_mediana = median(Total_Nitrogen_mg_L, na.rm = TRUE),
    Turbidity_NTU_mediana = median(Turbidity_NTU, na.rm = TRUE),
    n = n()
  ) %>%
  filter(n >= 3)

datos_resumen
## # A tibble: 6 × 4
##   TN_BIN  Total_Nitrogen_mg_L_mediana Turbidity_NTU_mediana     n
##   <fct>                         <dbl>                 <dbl> <int>
## 1 (1.5,2]                        1.9                   3.03    49
## 2 (2,2.5]                        2.35                  2.88   392
## 3 (2.5,3]                        2.78                  3.18   968
## 4 (3,3.5]                        3.24                  3.47   983
## 5 (3.5,4]                        3.67                  3.32   390
## 6 (4,4.5]                        4.11                  3.90    68

3. Definir variables

x <- datos_resumen$Total_Nitrogen_mg_L_mediana
y <- datos_resumen$Turbidity_NTU_mediana

4. Conjetura

# A partir del diagrama de dispersión se observa una
# tendencia exponencial entre el Nitrógeno Total y la Turbidez,
# lo que sugiere el uso de un ajuste exponencial.

plot(x, y,
     pch = 19,
     xlab = "Nitrógeno Total (mg/L)",
     ylab = "Turbidez (NTU)",
     main = "Gráfica Nº 1: Diagrama de dispersión\nentre el Nitrógeno Total y la Turbidez")

5. Parámetros

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

summary(modelo_exp)
## 
## Call:
## lm(formula = log(y) ~ x)
## 
## Residuals:
##         1         2         3         4         5         6 
##  0.048599 -0.055887 -0.004725  0.029418 -0.064439  0.047033 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.84051    0.09465   8.880 0.000889 ***
## x            0.11550    0.03052   3.785 0.019356 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.05643 on 4 degrees of freedom
## Multiple R-squared:  0.7817, Adjusted R-squared:  0.7271 
## F-statistic: 14.32 on 1 and 4 DF,  p-value: 0.01936
# Parámetros del modelo exponencial
a <- exp(coef(modelo_exp)[1])
b <- coef(modelo_exp)[2]

a
## (Intercept) 
##    2.317544
b
##         x 
## 0.1155028
# la ecuacion resulta final y=1.09-0,02x1 y 0.02x2 

6. Gráfica del modelo exponencial ajustado

plot(
  x, y,
  col = "deepskyblue",
  pch = 16,
  xlab = "Nitrógeno Total (mg/L)",
  ylab = "Turbidez (NTU)",
  main = "Gráfica N.º 2: Diagrama de Dispersión ajuste exponencial\nNitrógeno Total vs Turbidez"
)

curve(
  a * exp(b * x),
  from = min(x),
  to = max(x),
  add = TRUE,
  col = "blue",
  lwd = 2
)

7. Test

# Predicciones del modelo en escala log
y_log_hat <- predict(modelo_exp)

# Convertir a escala original
y_hat <- exp(y_log_hat)

# Coeficiente de correlación de Pearson
r <- cor(y, y_hat, method = "pearson")
r
## [1] 0.8892371
# Coeficiente de determinación (%)
r2 <- r^2 * 100
cat("Coeficiente de determinación (R²) =", round(r2, 2), "%\n")
## Coeficiente de determinación (R²) = 79.07 %

8. Restricciones del Modelo

"El modelo exponencial no presenta restricciones 
matemáticas internas, ya que la función exponencial es 
continua y siempre positiva.No obstante, desde el punto de
vista físico y estadístico,su aplicaciónse limita a valores
positivos de Nitrógeno Total y al rango de datosobservados en 
el estudio, evitando extrapolar fuera de dicho intervalo."
## [1] "El modelo exponencial no presenta restricciones \nmatemáticas internas, ya que la función exponencial es \ncontinua y siempre positiva.No obstante, desde el punto de\nvista físico y estadístico,su aplicaciónse limita a valores\npositivos de Nitrógeno Total y al rango de datosobservados en \nel estudio, evitando extrapolar fuera de dicho intervalo."
# Dominio
cat("Dominio del modelo: x >= 0\n")
## Dominio del modelo: x >= 0
# Rango
cat("Rango del modelo: y > 0\n")
## Rango del modelo: y > 0
# Intervalo de validez experimental
cat("Rango experimental de x:\n")
## Rango experimental de x:
range(x)
## [1] 1.90 4.11
cat("Rango experimental de y:\n")
## Rango experimental de y:
range(y)
## [1] 2.875 3.905

9. Estimación

# Valor objetivo de la variable independiente (Turbidez)
turb_objetivo <- 10   # puedes cambiar este valor según el ejercicio

# Estimación usando el modelo exponencial
nt_est <- a * exp(b * turb_objetivo)

# Gráfico solo para mostrar el resultado
plot(1, type = "n", axes = FALSE, xlab = "", ylab = "")
text(
  1, 1,
  labels = paste(
    "¿Cuál es la concentración esperada de Nitrógeno Total\n",
    "cuando la Turbidez es", turb_objetivo, "?\n\n",
    "Resultado estimado:",
    round(nt_est, 4), "mg/L"
  ),
  cex = 1.3,
  col = "blue",
  font = 2
)

10. Conclusión

En el intervalo entre la turbidez y la concentración de nitrógeno total en los cuerpos de agua monitoreados existe una relación de tipo exponencial, representada por: ŷ = a · e^(b · Turbidez) siendo Turbidez la medida de partículas en suspensión del agua (NTU) y ŷ la concentración estimada de nitrógeno total en mg/L. Dentro del intervalo seleccionado no existen restricciones, ya que la función exponencial está definida para todos los valores reales de la variable independiente. Se espera que, cuando la turbidez sea 10 NTU, se obtenga una concentración de nitrógeno total de aproximadamente X mg/L