# Cargar librerías necesarias
if (!require(dplyr)) install.packages("dplyr")
if (!require(ggplot2)) install.packages("ggplot2")
if (!require(gt)) install.packages("gt")
if (!require(readr)) install.packages("readr")
if (!require(sf)) install.packages("sf")
library(sf)
library(dplyr)
library(ggplot2)
library(gt)
library(readr)

1. Cargar datos

datos <- read.csv("C:/Users/Usuario/OneDrive/Escritorio/Mundo/Conjunto.csv", sep = ";")
datos$longitude <- as.numeric(datos$longitude)
datos$latitude <- as.numeric(datos$latitude)

# Eliminar filas con NA en coordenadas
datos <- datos[!is.na(datos$longitude) & !is.na(datos$latitude), ]

# Convertir a objeto espacial EPSG:3857 y transformar a EPSG:4326 (WGS84)
puntos_sf <- st_as_sf(datos, coords = c("longitude", "latitude"), crs = 3857)
puntos_wgs84 <- st_transform(puntos_sf, crs = 4326)

# Extraer coordenadas en grados decimales
coord_grados <- st_coordinates(puntos_wgs84)

resultado <- data.frame(
  longitude_deg = coord_grados[, 1],
  latitude_deg = coord_grados[, 2]
)

2. Seleccionar las variables con causalidad

# Filtrado de outliers y selección de máximos 
Q1_lat <- quantile(resultado$latitude_deg, 0.25)
Q3_lat <- quantile(resultado$latitude_deg, 0.75)
IQR_lat <- Q3_lat - Q1_lat
lat_no_outliers <- resultado$latitude_deg >= (Q1_lat - 1.5 * IQR_lat) & resultado$latitude_deg <= (Q3_lat + 1.5 * IQR_lat)

Q1_lon <- quantile(resultado$longitude_deg, 0.25)
Q3_lon <- quantile(resultado$longitude_deg, 0.75)
IQR_lon <- Q3_lon - Q1_lon
lon_no_outliers <- resultado$longitude_deg >= (Q1_lon - 1.5 * IQR_lon) & resultado$longitude_deg <= (Q3_lon + 1.5 * IQR_lon)

# Aplicamos los filtros
resultado_filtrado <- resultado[lat_no_outliers & lon_no_outliers, ]

# Aseguramos que haya datos antes de usar min/max
lat_min <- min(resultado_filtrado$latitude_deg, na.rm = TRUE)
lat_max <- max(resultado_filtrado$latitude_deg, na.rm = TRUE)

# Creamos los intervalos por latitud
resultado_filtrado <- resultado_filtrado %>%
  mutate(lat_bin = cut(latitude_deg,
                       breaks = seq(lat_min, lat_max, by = 0.1),
                       include.lowest = TRUE)) %>%
  filter(!is.na(lat_bin))  # Eliminar posibles NA en los bins

# Agrupamos por intervalo y extraemos los máximos por bin
maximos_por_lat_bin <- resultado_filtrado %>%
  group_by(lat_bin) %>%
  summarise(
    latitude_prom = mean(latitude_deg),
    longitude_max = max(longitude_deg)
  ) %>%
  ungroup() %>%
  arrange(latitude_prom)

3. Establecer la variable dependiente e independiente

# Extraer las variables verificarque sean vectoes numericos llenos
x <- maximos_por_lat_bin$latitude_prom
y <- maximos_por_lat_bin$longitude_max

4 Graficas nube de puntos

plot(x, y, col = "blue", pch = 19,
     main = "Modelo polinómico grado 3: Longitud vs Latitud",
     xlab = "Latitud promedio del bin (°)",
     ylab = "Máximo de longitud (°)")

# Se observa que relación tienen

5 Conjeturar un modelo

x2 <- x^2
x3 <- x^3
modelo_poly3 <- lm(y ~ x + x2 + x3)
modelo_poly3
## 
## Call:
## lm(formula = y ~ x + x2 + x3)
## 
## Coefficients:
## (Intercept)            x           x2           x3  
##   206.44565    -30.84953      1.08089     -0.01195

6 Calculo de los parametros

beta0 <- modelo_poly3$coefficients[1]
beta1 <- modelo_poly3$coefficients[2]
beta2 <- modelo_poly3$coefficients[3]
beta3 <- modelo_poly3$coefficients[4]

7 Sobreponer la curva

plot(x, y, col = "blue", pch = 19,
     main = "Modelo polinómico grado 3: Longitud vs Latitud",
     xlab = "Latitud promedio del bin (°)",
     ylab = "Máximo de longitud (°)")
curve(beta0 + beta1*x + beta2*x^2 + beta3*x^3, add = TRUE, col = "red", lwd = 2)

# Se observa la curva roja

8 Test

# Calcular coeficiente de correlación r (Pearson) 
cor_pearson <- cor.test(x, y, method = "pearson")
r <- cor_pearson$estimate
r
##         cor 
## -0.02992839
# Calcular coeficiente de determinación R²
summary(modelo_poly3)
## 
## Call:
## lm(formula = y ~ x + x2 + x3)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -38.558  -2.711   0.288   3.574  32.845 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 206.445649  27.723135   7.447 9.88e-13 ***
## x           -30.849528   2.878900 -10.716  < 2e-16 ***
## x2            1.080895   0.095064  11.370  < 2e-16 ***
## x3           -0.011953   0.001004 -11.903  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 9.844 on 305 degrees of freedom
## Multiple R-squared:  0.3678, Adjusted R-squared:  0.3616 
## F-statistic: 59.14 on 3 and 305 DF,  p-value: < 2.2e-16
r2 <- summary(modelo_poly3)$r.squared * 100
r2
## [1] 36.77716

9 Restricciones

# El modelo funciona para valores negativos como positivos no tiene restricciones

10 Calculo de predicciones

# Calculo de predicciones para una latitud de 30
y_tec <- 214.6534 - 31.7774*30 + 1.1141*30^2 - 0.01233*30^3
y_tec
## [1] -68.8886

11 Conclusiones

Entre la latitud promedio y la longitud máxima existe una relación no lineal, que puede modelarse mediante un polinomio de tercer grado, cuyo modelo es: y^<-214.6534−31.7774x + 1.1141x^2 + 0.01233x^2 donde y^ representa la longitud máxima (en grados) y𝑥la latitud promedio (también en grados).Además, podemos decir que la longitud máxima está explicada en un 36.7771% por la latitud promedio (según el coeficiente de determinación.𝑅^2, mientras que el 61.09% restante se debe a otros factores no incluidos en el modelo. Por otro lado, la correlación lineal simple entre latitud y longitud máxima es muy baja r=-0.02992839, lo que confirma que la relación no es lineal, sino más compleja y mejor representada mediante un modelo polinómico.*