1. Librerías

# -------------------------
# Cargar librerías
# -------------------------
library(gt)
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(htmltools)

2.Leer datos

# -------------------------
# Cargar datos
# -------------------------

datos <- read.csv("waterPollution.csv",
                  sep = ",",
                  stringsAsFactors = FALSE)

3. Selección (causa y efecto)

# ================================
# SELECCIÓN Y SEPARACIÓN
# ================================

#Justificaciòn 

#El fósforo total y los nitratos fueron seleccionados por ser indicadores representativos de la contaminación por nutrientes en cuerpos de agua. El análisis conjunto de ambas variables permite evaluar si existe una relación estadística entre la concentración de fósforo total (causa) y la concentración de nitratos (efecto).

datos$resultMeanValue <- as.numeric(gsub("-", NA, datos$resultMeanValue))

# Filtrado de códigos de propiedades observadas y selección de columnas clave
fosforo <- datos %>%  
  filter(observedPropertyDeterminandCode == "CAS_7723-14-0") %>%
  select(waterBodyIdentifier, phenomenonTimeReferenceYear, X_val = resultMeanValue)

nitratos <- datos %>%  
  filter(observedPropertyDeterminandCode == "CAS_14797-55-8") %>%
  select(waterBodyIdentifier, phenomenonTimeReferenceYear, Y_val = resultMeanValue)

# Unión interna para emparejar por cuerpo de agua y año
datos_pareados <- inner_join(fosforo, nitratos, by = c("waterBodyIdentifier", "phenomenonTimeReferenceYear"))
## Warning in inner_join(fosforo, nitratos, by = c("waterBodyIdentifier", "phenomenonTimeReferenceYear")): Detected an unexpected many-to-many relationship between `x` and `y`.
## ℹ Row 28 of `x` matches multiple rows in `y`.
## ℹ Row 64 of `y` matches multiple rows in `x`.
## ℹ If a many-to-many relationship is expected, set `relationship =
##   "many-to-many"` to silence this warning.

4. Tabla de pares de valores

# ================================
# TABLA DE PARES DE VALORES
# ================================
datos_pareados$X_val <- as.numeric(gsub("-", NA, datos_pareados$X_val))
datos_pareados$Y_val <- as.numeric(gsub("-", NA, datos_pareados$Y_val))
datos_tabla_limpia <- datos_pareados[complete.cases(datos_pareados$X_val, datos_pareados$Y_val), ]

tabla_valores <- datos_tabla_limpia %>%
  transmute(
    Observación = row_number(),
    `(X) Fósforo Total (mg/L)` = round(X_val, 4),
    `(Y) Nitratos (mg/L)` = round(Y_val, 4)
  )

tabla_gt <- tabla_valores %>%
  gt() %>%
  tab_header(
    title = "Tabla 1. Pares de valores observados de fósforo total y nitratos"
  ) %>%
  tab_source_note(
    source_note = "Fuente: Grupo 3."
  ) %>%
  cols_align(
    align = "center",
    columns = everything()
  )
browsable(
  div(
    style = "height:400px; overflow-y:auto; border:1px solid #ddd;",
    HTML(as_raw_html(tabla_gt))
  )
)
Tabla 1. Pares de valores observados de fósforo total y nitratos
Observación (X) Fósforo Total (mg/L) (Y) Nitratos (mg/L)
1 0.0133 2.4778
2 0.0567 5.9562
3 0.0483 5.2731
4 0.0825 22.8052
5 0.1433 15.0225
6 1.2500 6.2669
7 0.0692 4.5484
8 0.0208 3.5404
9 0.0208 3.3988
10 0.0450 18.8600
11 0.0408 2.6882
12 1.2425 9.4184
13 0.0663 37.2701
14 0.1108 5.2481
15 0.1108 5.5813
16 0.0338 3.4321
17 0.0200 0.9330
18 0.0833 7.2807
19 0.0833 6.0645
20 0.1383 4.4984
21 0.0600 40.9655
22 1.0925 8.2506
23 0.8450 32.0019
24 0.0133 0.9830
25 0.2467 12.7622
26 0.0688 26.4823
27 0.1865 28.3649
28 0.1119 19.0099
29 0.1261 17.7437
30 0.0274 18.5268
31 0.0839 24.4330
32 0.1147 19.0099
33 0.0822 23.3084
34 0.1025 29.1230
35 0.1050 18.2983
36 0.2278 25.7541
37 0.1217 18.3935
38 0.1225 18.1322
39 0.0142 2.0659
40 0.0333 10.6629
41 0.0333 3.1156
42 0.1100 1.7398
43 0.3680 3.6434
44 0.0383 31.7010
45 0.5483 13.7201
46 0.1333 5.1504
47 0.0517 2.2425
48 0.1251 21.4469
49 0.1167 19.7097
50 0.1595 17.8020
51 0.0676 2.5004
52 0.1267 9.3300
53 0.0850 5.9479
54 0.0983 7.2807
55 0.0983 6.0645
56 0.1351 28.2983
57 0.1100 9.6504
58 0.0200 1.4661
59 0.0300 4.9316
60 0.0266 8.8802
61 0.0266 7.4807
62 0.0133 0.5998
63 0.1467 6.9808
64 0.0483 1.5494
65 0.0200 1.7327
66 0.0167 1.7161
67 0.3717 17.0606
68 0.0224 46.2754
69 0.0881 11.5875
70 0.0846 11.5875
71 0.2533 39.3360
72 0.0567 5.9562
73 0.0150 1.5994
74 0.0455 6.3068
75 0.2483 23.5583
76 0.1358 17.4129
77 0.0183 3.0656
78 0.0250 3.5487
79 0.0267 4.7483
80 0.1908 3.9223
81 0.0680 6.8476
82 0.0600 18.5768
83 0.0450 5.7980
84 0.0967 12.0457
85 0.0675 5.4064
86 0.0500 48.1494
87 0.2442 33.6214
88 1.0601 5.2398
89 0.1589 8.0067
90 0.6258 9.9546
91 0.1662 19.1723
92 0.2085 11.9189
93 0.1655 33.9470
94 0.0750 3.1489
95 0.0317 4.8816
96 0.0255 2.8323
97 0.1192 34.8876
98 0.1575 3.4238
99 0.0375 28.1567
100 0.0927 7.1641
101 0.0927 7.2702
102 0.1630 31.4305
103 0.0400 6.4461
104 0.0871 14.1038
105 0.0300 21.0259
106 0.1300 20.3761
107 0.1300 8.0688
108 0.0453 8.8802
109 0.0453 7.4807
110 0.1000 25.2410
111 0.0079 0.2284
112 0.2378 5.3522
113 0.0138 0.8500
114 0.0087 1.1324
115 0.0717 6.6143
116 0.0461 4.0002
117 0.0917 6.7892
118 0.0150 1.1496
119 0.0133 2.4491
120 0.0083 7.0004
121 0.1870 18.3756
122 0.1868 27.9268
123 0.0553 14.8601
124 0.0283 5.2815
125 0.0475 53.5609
126 0.0317 3.0839
127 0.0150 0.7544
128 0.0800 2.2425
129 0.0617 4.8483
130 0.1000 0.9996
131 0.1333 0.9996
132 0.1167 2.6657
133 0.0600 1.3995
134 0.0450 2.8323
135 0.2891 15.5399
136 0.0517 14.5615
137 0.1088 7.7556
138 0.0811 17.5771
139 0.0282 16.7214
140 0.0500 24.1581
141 0.0917 27.1487
142 0.0200 1.6161
143 0.0853 11.9234
144 0.1685 14.9496
145 0.0200 16.2276
146 0.0155 16.4760
147 0.0120 47.9028
148 2.1034 7.4431
149 0.1848 19.4181
150 0.6690 19.4181
151 0.0583 6.8143
152 0.0200 5.0316
153 0.0480 32.9083
154 0.0133 0.3582
155 0.1567 42.6849
156 0.2415 8.6386
157 0.2313 16.8732
158 0.0583 2.4991
159 0.1000 1.6661
160 0.0200 3.2488
161 0.0850 7.1808
162 0.0850 8.3720
163 0.2920 0.3055
164 0.0600 8.2471
165 0.0933 19.3098
166 0.2241 51.3975
167 0.0533 22.9585
168 0.0817 11.8291
169 0.0133 2.9989
170 0.0533 8.2138
171 0.2028 37.6783
172 0.2812 29.2813
173 0.1467 35.8290
174 0.0592 7.2308
175 0.3555 13.9534
176 0.0342 3.4738
177 0.0796 19.2813
178 0.0341 3.9079
179 0.2803 15.3875
180 0.0578 1.2662
181 0.1713 14.9208
182 0.1798 19.4345
183 0.2460 21.0358
184 0.1129 20.6926
185 0.3297 17.7021
186 0.4642 10.2006
187 0.0592 23.8749
188 0.0583 3.3738
189 0.1133 26.5572
190 0.0683 9.3467
191 0.0617 6.8143
192 0.0538 7.5348
193 0.3633 24.0248
194 0.3633 19.6264
195 0.1003 21.4015
196 0.0680 14.2449
197 0.0167 5.1648
198 0.0092 0.5914
199 0.0093 0.3373
200 0.0509 1.2493
201 0.0079 0.4551
202 0.0069 0.5547
203 0.0246 1.2086
204 0.0082 0.3342
205 0.0120 0.3396
206 0.0120 0.5733
207 0.0355 0.3041
208 0.0844 25.1994
209 0.1291 7.8469
210 0.2350 65.1389
211 0.4562 18.4137
212 0.1167 10.4546
213 0.0580 3.5062
214 0.1419 12.1632
215 0.1650 33.4423
216 0.1334 11.6061
217 0.0965 19.6633
218 0.1996 25.8249
219 0.1547 12.5745
220 0.3210 13.3053
221 0.0887 9.9132
222 0.0989 19.8846
223 0.0934 7.7389
224 0.3076 21.1956
225 0.1361 16.3858
226 0.0334 4.6169
227 0.0542 10.9865
228 0.0454 4.2490
229 0.1591 5.8091
230 0.2104 6.0752
231 0.3107 24.0461
232 0.0785 1.6061
233 0.1075 20.0012
234 0.0838 17.2522
235 0.0587 12.5706
236 0.0577 27.1650
237 0.0641 7.4484
238 0.0113 1.1315
239 0.0166 7.7118
240 0.0279 20.1021
241 0.0079 0.4338
242 0.0416 2.6845
243 0.0173 0.2200
244 0.0060 0.2098
245 0.0071 0.2546
246 0.0124 0.9797
247 0.0184 1.4844
248 1.0750 13.4235
249 0.0060 0.4268
250 0.0214 0.3971
251 0.0093 0.2723
252 0.0185 0.5914
253 0.0083 0.4763
254 0.0084 0.4445
255 0.0165 4.0720
256 0.0073 0.3754
257 0.0173 1.2976
258 0.0071 0.2975
259 0.0419 20.6223
260 0.0068 0.2900
261 0.0510 26.0817
262 2.7583 0.4166
263 0.0133 2.1159
264 0.2340 18.7767
265 0.0807 17.4021
266 0.0275 5.3314
267 0.0950 36.1039
268 0.2675 11.2410
269 0.0998 5.4545
270 0.1122 8.7801
271 0.0184 0.2855
272 0.0059 0.2559
273 0.0078 0.5326
274 0.0267 2.1009
275 0.0872 44.5507
276 0.0695 13.5285
277 0.0725 24.4913
278 0.0365 38.7446
279 0.0727 21.0675
280 0.0583 37.1202
281 0.0933 29.6061
282 0.0550 11.8291
283 0.1183 32.1886
284 0.0068 3.5173
285 0.9338 53.8620
286 0.0275 12.5039
287 0.2145 32.1582
288 0.0500 11.7634
289 0.0565 0.2776
290 0.1078 0.9221
291 0.0470 20.0986
292 0.0527 13.1953
293 0.0528 28.3293
294 0.1079 26.6655
295 0.0850 15.0113
296 0.0293 1.8089
297 0.0185 0.4073
298 0.0273 4.5484
299 0.0273 5.7813
300 0.5875 9.2507
301 0.0333 6.5723
302 0.0521 5.8286
303 0.0206 0.7840
304 0.0207 0.6875
305 0.0310 5.6134
306 0.0388 0.4445
307 0.0543 20.0145
308 0.0123 0.9553
309 0.0128 2.4428
310 0.0543 35.1136
311 0.0516 7.8836
312 0.0724 17.7045
313 0.0788 23.3267
314 0.0141 0.6370
315 0.1740 19.3380
316 0.0575 13.1849
317 0.0433 1.4495
318 0.0425 2.0661
319 0.0383 0.9497
320 0.0550 6.0978
321 0.3417 18.0053
322 0.0060 0.3484
323 0.0083 0.3975
324 0.0060 0.6397
325 0.0143 1.1479
326 0.0060 0.3227
327 0.0097 0.3156
328 0.0069 0.4232
329 0.0121 0.3834
330 0.0057 0.6933
331 0.0183 29.2896
332 0.0300 15.7861
333 0.0600 23.8772
334 0.1051 12.1927
335 0.0517 4.9982
336 0.0612 18.1184
337 0.0442 17.8346
338 0.1375 9.9048
339 0.0060 2.2857
340 0.0280 2.9190
341 0.1128 21.3341
342 0.1161 24.8578
343 0.0132 0.2484
344 0.0250 3.9736
345 0.0650 8.9718
346 0.0969 7.3589
347 0.0862 6.8360
348 0.1217 12.3290
349 0.1000 12.7021
350 0.0392 9.8923
351 0.0307 12.7288
352 0.0508 4.8906
353 0.0274 6.9823
354 0.0453 4.7400
355 0.3181 5.3493
356 0.4565 4.6484
357 0.3073 30.3877
358 0.0556 31.2546
359 0.0599 21.2828
360 0.0217 3.3272
361 0.1384 25.6909
362 0.1384 41.6519
363 0.0267 2.8257
364 0.1113 17.1522
365 0.0525 5.9979
366 0.0467 12.0290
367 0.0617 14.2000
368 0.0158 16.4608
369 0.2533 22.0722
370 0.0208 4.9482
371 0.0242 1.9993
372 0.1125 16.3400
373 0.1460 11.9374
374 0.1592 10.1932
375 0.0200 6.0178
376 0.1252 14.6602
377 0.0078 0.3519
378 0.0123 1.1873
379 0.0886 32.9740
380 0.0279 34.0713
381 0.0882 6.3511
382 0.1786 20.8954
383 0.0983 7.9757
384 0.0833 0.3542
385 0.0917 15.9610
386 0.0217 2.2659
387 0.0500 17.8020
388 0.0992 32.0220
389 0.1866 12.5914
390 0.1023 19.0432
391 0.1217 33.7047
392 0.0238 43.6012
393 0.0317 1.4495
394 0.0445 35.2958
395 0.0446 24.3080
396 0.1264 19.1689
397 0.1487 11.9050
398 0.0129 0.4657
399 0.0321 5.6563
400 0.2418 3.9474
401 0.1300 6.0318
402 0.6151 32.7487
403 0.0420 2.9506
404 0.0598 20.7663
405 0.1110 38.6715
406 0.0758 29.7631
407 0.2011 13.5035
408 0.2997 29.8194
409 0.0700 7.6973
410 0.0200 2.2159
411 0.0785 2.4428
412 0.0300 3.2655
413 0.0117 5.6502
414 0.1142 33.0383
415 0.3543 20.9100
416 0.0737 3.6744
417 0.0159 0.3944
418 0.0796 28.1109
419 0.0658 18.9016
420 0.2757 10.1755
421 0.0812 7.3724
422 0.0727 7.6473
423 0.1193 12.7303
424 0.1193 6.8132
425 0.2090 21.1134
426 0.0650 6.4644
427 0.0838 32.7217
428 0.0751 38.8112
429 0.2377 18.4864
430 0.2475 26.2632
431 0.1498 29.7185
432 0.0790 9.4775
433 0.9250 11.0007
434 0.1168 28.8456
435 0.0133 3.4521
436 0.2229 18.9683
437 0.1959 19.7513
438 0.0100 0.4998
439 0.0200 1.4495
440 0.0287 4.5484
441 0.0287 5.7813
442 0.0767 22.2754
443 0.0325 2.8323
444 0.0808 12.8704
445 0.0550 15.6986
446 0.0617 8.6136
447 0.0617 10.2130
448 0.1050 36.0539
449 0.0400 8.6136
450 0.0400 10.2130
451 0.0443 14.0965
452 0.0853 26.0715
453 0.0373 1.4153
454 0.0179 3.7070
455 0.0600 29.4145
456 0.0117 0.6034
457 0.0534 3.9746
458 0.0585 4.6541
459 0.0526 9.7523
460 0.0122 2.8323
461 0.0315 1.4162
462 0.0125 1.9493
463 0.0233 3.0489
464 0.0162 1.9993
465 0.1029 23.1668
466 0.0467 3.0656
467 0.0467 2.9323
468 0.0633 10.1880
469 0.3072 25.1933
470 0.2417 20.8426
471 0.2880 5.3257
472 0.0298 1.1501
473 0.0485 24.8934
474 0.2133 1.3887
475 0.0233 1.1663
476 0.1117 8.8219
477 0.0671 6.6560
478 0.0300 17.4105
Fuente: Grupo 3.

5.Gráfica de Dispersión

# ------------------------------------------------------------------------------
# 4. GRÁFICA DE DISPERSIÓN 
# ------------------------------------------------------------------------------

x_crudo <- log(datos_tabla_limpia$X_val)
Y_crudo <- log(datos_tabla_limpia$Y_val)

plot(x_crudo, Y_crudo,
     main = "Gráfica No 1: Diagrama de dispersión entre el Fósforo Total y\nNitratos en el estudio de los cuerpos de agua de Europa",
     xlab = "Fósforo Total (mg/L)",
     ylab = "Nitratos (mg/L)",
     col = rgb(135, 206, 235, maxColorValue = 255, alpha = 90), 
     pch = 16,
     cex = 0.9,
     xlim = c(-5.5, -1.2), 
     ylim = c(-1.5, 3.8),
     xaxt = "n",  
     yaxt = "n", 
     xaxs = "r", yaxs = "r")

marcas_x_log <- c(-5, -4, -3, -2)
valores_x_reales <- round(exp(marcas_x_log), 4)
axis(side = 1, at = marcas_x_log, labels = valores_x_reales, cex.axis = 0.8)

marcas_y_log <- c(-1, 0, 1, 2, 3)
valores_y_reales <- round(exp(marcas_y_log), 2)
axis(side = 2, at = marcas_y_log, labels = valores_y_reales, cex.axis = 0.8, las = 1)

6. Tratamiento de Datos

# ================================
# TRATAMIENTO DE LOS DATOS
# ================================
datos_filtrados <- datos_tabla_limpia

if (nrow(datos_tabla_limpia) > 5) {
  Q1_X <- quantile(datos_tabla_limpia$X_val, 0.25, na.rm = TRUE)
  Q3_X <- quantile(datos_tabla_limpia$X_val, 0.75, na.rm = TRUE)
  IQR_X <- Q3_X - Q1_X
  
  Q1_Y <- quantile(datos_tabla_limpia$Y_val, 0.25, na.rm = TRUE)
  Q3_Y <- quantile(datos_tabla_limpia$Y_val, 0.75, na.rm = TRUE)
  IQR_Y <- Q3_Y - Q1_Y
  
  lin_inf_X <- Q1_X - 1.5 * IQR_X
  lin_sup_X <- Q3_X + 1.5 * IQR_X
  lin_inf_Y <- Q1_Y - 1.5 * IQR_Y
  lin_sup_Y <- Q3_Y + 1.5 * IQR_Y
  
  candidatos <- datos_tabla_limpia[
    datos_tabla_limpia$X_val >= lin_inf_X & datos_tabla_limpia$X_val <= lin_sup_X &
    datos_tabla_limpia$Y_val >= lin_inf_Y & datos_tabla_limpia$Y_val <= lin_sup_Y,
  ]
  
  if (nrow(candidatos) > 0) {
    datos_filtrados <- candidatos
  }
}

# Verificación de ceros (requisito para logaritmo)
sum(datos_filtrados$X_val == 0)
## [1] 0
sum(datos_filtrados$Y_val == 0)
## [1] 0
# Redondeo y agregación por promedio para extraer la tendencia central (suavizado)
datos_filtrados$X_val_red <- round(datos_filtrados$X_val, 2)

datos_prom <- aggregate(
  Y_val ~ X_val_red,
  data = datos_filtrados,
  FUN = mean,
  na.rm = TRUE
)

# Variables definitivas en escala logarítmica para el modelo final
x <- log(datos_prom$X_val_red)
y <- log(datos_prom$Y_val)

7. Gráfica Simplificada

# ------------------------------------------------------------------------------
#  Grafica Simplificada
# ------------------------------------------------------------------------------
plot(x, y,  
     main = "Gráfica No 2: Diagrama simplificado entre Fósforo Total y Nitratos 
     en el estudio de los cuerpos de agua en Europa",  
     xlab = "Fósforo Total (mg/L)",  
     ylab = "Nitratos (mg/L)",
     col = "skyblue", 
     pch = 16, 
     cex = 1.3,
     xaxt = "n",  
     yaxt = "n")  

marcas_x_log2 <- seq(-4.5, -1.5, by = 0.5)
valores_x_reales2 <- round(exp(marcas_x_log2), 4)
axis(side = 1, at = marcas_x_log2, labels = valores_x_reales2, cex.axis = 0.7, las = 1)

marcas_y_log2 <- seq(0.5, 3.0, by = 0.5)
valores_y_reales2 <- round(exp(marcas_y_log2), 1)
axis(side = 2, at = marcas_y_log2, labels = valores_y_reales2, cex.axis = 0.7, las = 1)

## COMENTARIO:
#Cabe destacar que analizando la distribución de la variable causa, el gráfico podría trabajarse bajo un enfoque segmentado en dos secciones distintas: una que abarca desde un Fósforo Total de 0 hasta 0.0183 mg/L, y una segunda sección que se extiende de 0.0183 hasta 0.2231 mg/L. Sin embargo, se determinó mantener una única estructura de linealidad global para toda la gráfica. Esto evita complejizar innecesariamente el modelo únicamente por la influencia o ajuste puntual de un solo valor aislado en el origen.

8. Conjetura

#La nube de puntos presenta una tendencia creciente y lineal, sin evidenciar patrones curvilíneos dominantes, lo que sugiere que un modelo de regresión lineal resulta adecuado para describir la relación entre ambas variables. Aunque los miles de datos crudos muestran una dispersión caótica por el ruido ambiental, al estabilizar la varianza y extraer la tendencia centra, la masa de datos se reduce a una trayectoria nítida de puntos representativos. 

9. Cálculo de parámetros

# ========================
# CÁLCULO DE PARÁMETROS
# ========================
regresionlineal <- lm(y ~ x)
intercepto <- coef(regresionlineal)[1]
pendiente  <- coef(regresionlineal)[2]

print(paste("Intercepto (beta 0):", round(intercepto, 4)))
## [1] "Intercepto (beta 0): 4.1303"
print(paste("Pendiente (beta 1):", round(pendiente, 4)))
## [1] "Pendiente (beta 1): 0.6566"

Modelo de Regresión Lineal obtenido

Y = β 0 + β 1 * X

(Donde Y = Nitratos y X = Fósforo Total en mg/L)


Significado de los parámetros:

  • β 0 (Intercepto): Representa el valor basal teórico. Indica el valor de la concentración de Nitratos esperado si el valor del Fósforo Total fuese cero en la escala del modelo.
  • β 1 (Pendiente / Elasticidad): Determina la tasa de cambio ambiental. Indica cuánto aumenta, en promedio, el valor de la concentración de Nitratos (mg/L) por cada incremento unitario en el valor de Fósforo Total.

10. Comparación de la realidad con el modelo

plot(x, y,  
     main = "Gráfica No 3: Regresión lineal entre Fósforo Total y Nitratos\nen el estudio de los cuerpos de agua en Europa",  
     xlab = "Fósforo Total (mg/L)",  
     ylab = "Nitratos (mg/L)",
     col = "skyblue", 
     pch = 16, 
     cex = 1.3,
     xaxt = "n",  
     yaxt = "n") 

abline(regresionlineal, col = "red", lwd = 2)
axis(side = 1, at = marcas_x_log2, labels = valores_x_reales2, cex.axis = 0.7, las = 1)
axis(side = 2, at = marcas_y_log2, labels = valores_y_reales2, cex.axis = 0.7, las = 1)

11. Test de bondad

# =================
# TEST DE BONDAD
# =================
r_valor <- cor(x, y, use = "complete.obs")
r_porcentaje <- r_valor * 100
r2_porcentaje <- summary(regresionlineal)$r.squared * 100

print(paste(" Coeficiente de correlación (%):", round(r_porcentaje, 2), "%"))
## [1] " Coeficiente de correlación (%): 87.22 %"
print(paste(" Coeficiente de determinación (R² %):", round(r2_porcentaje, 2), "%"))
## [1] " Coeficiente de determinación (R² %): 76.08 %"

12. Restricciones

# Dominio [X]:
# D = {x ∈ R+ U 0 }

# Dominio [Y]:
# D = {y ∈ R+ U 0 }

# ¿Existe algún valor en el dominio de X que, sustituido en el modelo matemático,
# genere un valor en Y fuera de su dominio?
#
# No. Al evaluar el modelo matemático dentro del dominio observado del Fósforo Total , las concentraciones estimadas de Nitratos permanecen dentro de su dominio observado. Por ello, el modelo no genera valores fuera del rango de los datos cuando se utiliza dentro de su dominio de aplicación.

13. Estimaciones

#=================
#  ESTIMACIONES
#=================

### Pregunta

# ¿Cuál es la concentración estimada de Nitratos cuando la concentración
# de Fósforo Total es de 0.05 mg/L, según el modelo lineal obtenido?

#--------------------------------------------------------------------------
# Valor de X para realizar la estimación
#--------------------------------------------------------------------------

fosforo_real <- 0.05

# Valor en la escala del modelo
fosforo_modelo <- log(fosforo_real)

#--------------------------------------------------------------------------
# Parámetros del modelo lineal
#--------------------------------------------------------------------------

intercepto <- coef(regresionlineal)[1]
pendiente  <- coef(regresionlineal)[2]

#--------------------------------------------------------------------------
# Estimación
#--------------------------------------------------------------------------

nitratos_modelo <- intercepto + pendiente * fosforo_modelo

nitratos_real <- exp(nitratos_modelo)

# RESPUESTA
# Al sustituir X = 0.05 mg/L en el modelo lineal se obtiene una concentración
# estimada de Nitratos de 8.70 mg/L.


#==============================================================================
# GRÁFICA No. 4: MODELO LINEAL CON ESTIMACIÓN (EJES CORREGIDOS A VALORES REALES)
#==============================================================================

# 1. Parámetros y cálculos previos
fosforo_real <- 0.05
fosforo_modelo <- log(fosforo_real)

intercepto <- coef(regresionlineal)[1]
pendiente  <- coef(regresionlineal)[2]

nitratos_modelo <- intercepto + pendiente * fosforo_modelo
nitratos_real <- exp(nitratos_modelo)

# Configuración de límites del lienzo
x_min <- min(x, na.rm = TRUE) - 0.5
x_max <- max(x, na.rm = TRUE) + 0.5
y_min <- min(y, na.rm = TRUE) - 0.5
y_max <- max(y, na.rm = TRUE) + 1.2

# 2. Lienzo base desactivando los ejes automáticos (xaxt="n", yaxt="n")
plot(
  x,
  y,
  type = "n",
  main = "Gráfica No. 4: Modelo de Regresión Lineal con Estimación",
  xlab = "Fósforo Total (mg/L)",
  ylab = "Nitratos (mg/L)",
  xlim = c(x_min, x_max),
  ylim = c(y_min, y_max),
  xaxt = "n",  # Desactiva eje X automático
  yaxt = "n",  # Desactiva eje Y automático
  xaxs = "r",
  yaxs = "r"
)

# 3. Recta del modelo (Roja)
abline(regresionlineal, col = "red", lwd = 2)

# 4. Líneas auxiliares delgadas
segments(x0 = fosforo_modelo, y0 = y_min - 2, x1 = fosforo_modelo, y1 = nitratos_modelo, col = "gray60", lty = 2)
segments(x0 = x_min - 2, y0 = nitratos_modelo, x1 = fosforo_modelo, y1 = nitratos_modelo, col = "gray60", lty = 2)

# 5. Punto estimado (Rombo Azul)
points(fosforo_modelo, nitratos_modelo, col = "blue", pch = 18, cex = 1.6)

# 6. Etiquetas azules de proyección (Valores reales)
text(fosforo_modelo, y_min + 0.15, labels = paste0(fosforo_real, " mg/L"), col = "blue", font = 2, pos = 4, cex = 0.7)
text(x_min + 0.05, nitratos_modelo, labels = paste0(round(nitratos_real, 2), " mg/L"), col = "blue", pos = 3, font = 2, cex = 0.7)

# 7. CONSTRUCCIÓN DE EJES PERSONALIZADOS EN VALORES REALES
# Eje X
marcas_x_log <- seq(-5, -1, by = 1)
valores_x_reales <- round(exp(marcas_x_log), 4)
axis(side = 1, at = marcas_x_log, labels = valores_x_reales, cex.axis = 0.75)

# Eje Y
marcas_y_log <- seq(0, 4, by = 1)
valores_y_reales <- round(exp(marcas_y_log), 1)
axis(side = 2, at = marcas_y_log, labels = valores_y_reales, cex.axis = 0.75, las = 1)

# 8. CONSTRUCCIÓN DE LEYENDA COMPACTA AUTO-AJUSTADA
txt1 <- paste0("Estimación: X = ", fosforo_real, " mg/L → Y = ", round(nitratos_real, 2), " mg/L")
txt2 <- paste0("Modelo: Y = ", round(intercepto, 4), " + ", round(pendiente, 4), "X")
textos_leyenda <- c(txt1, txt2)

# Calculamos el ancho exacto del texto para ajustar la caja
ancho_perfecto <- max(strwidth(textos_leyenda, cex = 0.65))

legend(
  "topright",
  legend = textos_leyenda,
  col = c("blue", "red"),
  pch = c(18, NA),
  lty = c(0, 1),
  lwd = c(NA, 2),
  bty = "o",
  box.col = "black",
  bg = "white",
  cex = 0.65,
  x.intersp = 0.4,
  y.intersp = 0.8,
  text.width = ancho_perfecto * 1.15  
)

## INTERPRETACIÓN:
## La recta roja representa el modelo de regresión lineal ajustado a los datos.El punto azul muestra la estimación realizada para una concentración de Fósforo Total de 0.05 mg/L. Según el modelo, la concentración esperada de Nitratos es de aproximadamente 8.70 mg/L.

14. Conclusión

Entre la concentración de fósforo total y nitratos existe una relación lineal positiva, representada por la ecuación Y = 4.1303 + 0.6566X. El modelo presentó un coeficiente de correlación del 87.22% y un coeficiente de determinación del 76.08 %. El modelo no presenta restricciones dentro del dominio.