1 Regresión Polinómica

1.1 Carga de datos

setwd("/cloud/project")
datos <- read.csv("DERRAMES_GLOBALEST.csv", header = TRUE, sep = ";" , dec = ".")
str(datos)
## 'data.frame':    3550 obs. of  23 variables:
##  $ Id                              : int  6786 6250 8220 6241 6216 6620 6262 6229 6201 6221 ...
##  $ Dia                             : int  19 3 21 16 19 7 10 12 18 29 ...
##  $ Mes                             : int  1 6 4 3 12 10 2 5 3 1 ...
##  $ Año                             : chr  "A" "1979" "2010" "1978" ...
##  $ Nombre                          : chr  "Arabian Gulf Spills; Persian Gulf, Kuwait" "IXTOC I; Bahia de Campeche, Mexico" "Deepwater Horizon; Gulf of Mexico" "Amoco Cadiz; Brittany, France" ...
##  $ Ubicacion                       : chr  "Persian Gulf, Kuwait" "Bahia de Campeche, Mexico" "Gulf of Mexico" "Brittany, France" ...
##  $ Latitud                         : chr  "29,5" "19,4083" "28,7367" "48,5833" ...
##  $ Longuitud                       : chr  "48" "-92,325" "-88,3872" "-4,71667" ...
##  $ Amenaza                         : chr  "Oil" "Oil" "Oil" "Oil" ...
##  $ Etiquetas                       : chr  "" "Collision" "" "Grounding" ...
##  $ Tipo_de_crudo                   : chr  "Kuwait crude oil" "IXTOC I crude oil" "Diesel, crude oil" "Arabian light crude, Iranian light crude, Bunker C" ...
##  $ Cantidad_recuperada_superficie  : int  NA NA 1 NA NA NA NA NA NA NA ...
##  $ Cantidad_recuperada_costas      : int  NA NA 1 NA NA NA NA NA NA NA ...
##  $ Cantidad_tratada_biologicamente : int  1 NA 1 1 NA NA NA NA NA NA ...
##  $ Cantidad_dispersada_quimicamente: int  NA 1 1 1 NA NA NA 1 1 1 ...
##  $ Cantidad_quemada                : int  NA 1 1 NA NA NA NA 1 1 1 ...
##  $ Maximo_liberacion_galones       : int  336000009 NA 205000000 68000017 NA NA NA 9240000 36100000 NA ...
##  $ Barreras_de_contencion_flotantes: int  35 12 182 17 3 3 7 8 5 6 ...
##  $ Causa_principal                 : chr  "Daño del tanque  " "Incendio y explosion " "Incendio y explosion " "Daño del tanque " ...
##  $ Volumen_derramados_galones      : chr  "336.000.000" "365.000.000" "600.000.000" "68.000.000" ...
##  $ Respuesta_actual_galones        : chr  "336000000" "252000000" "168000000" "68700000" ...
##  $ Fuente_respuesta                : chr  "description and posts" "posts" "description" "posts" ...
##  $ etiqueta_actualizacion          : chr  "RA updated" "RA newly acquired" "RA updated" "RA updated" ...

1.2 Conversión a numérico

x <- as.numeric(gsub(",", ".", gsub("\\.", "", datos$Maximo_liberacion_galones)))
y <- as.numeric(gsub(",", ".", gsub("\\.", "", datos$Respuesta_actual_galones)))

df <- na.omit(data.frame(x, y))

1.3 Eliminar duplicados (X, Y)

df_unicos <- df[!duplicated(df[, c("x", "y")]), ]

# Eliminar repetidos en X y Y 
df_ind <- df_unicos[
  !duplicated(df_unicos$x) &
    !duplicated(df_unicos$y),
]
 
# Escalar
df_ind$x <- as.numeric(scale(df_ind$x))
df_ind$y <- as.numeric(scale(df_ind$y))

1.4 Resultados del modelo

modelo <- lm(y ~ poly(x, 3, raw = TRUE), data = df_ind)
summary(modelo)
## 
## Call:
## lm(formula = y ~ poly(x, 3, raw = TRUE), data = df_ind)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.13531 -0.00238 -0.00224 -0.00064  1.01781 
## 
## Coefficients:
##                           Estimate Std. Error t value Pr(>|t|)    
## (Intercept)             -0.0040796  0.0071792  -0.568  0.57030    
## poly(x, 3, raw = TRUE)1  0.9082261  0.0390467  23.260  < 2e-16 ***
## poly(x, 3, raw = TRUE)2 -0.0275520  0.0087682  -3.142  0.00185 ** 
## poly(x, 3, raw = TRUE)3  0.0026174  0.0004539   5.767 2.06e-08 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.1069 on 291 degrees of freedom
## Multiple R-squared:  0.9887, Adjusted R-squared:  0.9886 
## F-statistic:  8475 on 3 and 291 DF,  p-value: < 2.2e-16
# Coeficientes 
coefs <- coef(modelo)
a <- coefs[1]
b <- coefs[2]
c <- coefs[3]
d <- coefs[4]

# Correlación
R2 <- summary(modelo)$r.squared
R2_adj <- summary(modelo)$adj.r.squared

cat("R² =", round(R2, 4), "\n")
## R² = 0.9887
cat("R² ajustado =", round(R2_adj, 4), "\n")
## R² ajustado = 0.9886

1.5 Representación gráfica del modelo

plot(df_ind$x, df_ind$y,
     col = "deepskyblue3",
     pch = 19,
     main = "Relación Polinómica entre Liberación Máxima \n y Respuesta actual de Petróleo",
     xlab = "Máxima liberación (escalada)",
     ylab = "Respuesta actual (escalada)",
     cex.axis = 0.8,
     cex.lab = 0.9)

curve(a + b*x + c*x^2 + d*x^3,
      add = TRUE,
      col = "red",
      lwd = 2)

grid(col = "gray80", lty = "dotted")

legend("topleft",
       legend = c("Datos", "Modelo polinómico"),
       col = c("deepskyblue3", "red"),
       pch = c(19, NA),
       lty = c(NA, 1),
       lwd = c(NA, 2),
       bty = "n",
       cex = 0.8)

1.6 Conclusión

El modelo polinómico de tercer grado describe adecuadamente la relación no lineal entre la máxima liberación y la respuesta actual, evidenciando una tendencia creciente con curvatura positiva. La forma del ajuste indica que la tasa de incremento de la respuesta aumenta a medida que crece la liberación, lo que sugiere un efecto acelerado. El valor de 0.9886 obtenido (alto) confirma que el modelo explica una proporción significativa de la variabilidad de la respuesta, por lo que el ajuste es estadísticamente representativo dentro del rango de datos analizado.