library(readxl)
library(knitr)
library(fitdistrplus)
## Cargando paquete requerido: MASS
## Cargando paquete requerido: survival
Datos <- read_xlsx("C:/Users/LEO/Documents/Antisana/weatherdataANTISANA.csv.xlsx")
Solar_Total <- as.numeric(Datos$Solar)
Solar_Total <- Solar_Total[!is.na(Solar_Total)]
hist(Solar_Total, freq = FALSE, main="Gráfica 102. Distribución Completa de Datos Originales",
xlab="MJ/m2", ylab="Densidad", col="blue")

# Filtramos para que R solo trabaje con los datos en este rango específico
Solar <- Solar_Total[Solar_Total >= 5 & Solar_Total <= 20]
# Definimos los cortes de 5 a 20 de 5 en 5
cortes <- seq(5, 20, by = 3)
# Histograma del segmento 5-20
histograma <- hist(Solar, freq = FALSE, main="Gráfica 103.Modelo de probabilidad Log-Normal (Rango 5-20)",
xlab="MJ/m2", ylab="Densidad de probabilidad", col="blue")

# Ajuste del modelo al histograma filtrado CON AGRUPACIÓN de 5 en 5
histograma <- hist(Solar, breaks = cortes, freq = FALSE, main="Gráfica 104 .Modelo de probabilidad Log-Normal
de Radiación Solar (5-20)",
xlab="MJ/m2", ylab="Densidad de probabilidad", col="blue")
h <- length(histograma$counts)
# Estimamos parámetros meanlog y sdlog para el segmento 5-20
fit_ln <- fitdist(Solar, "lnorm")
meanlog_s <- fit_ln$estimate["meanlog"]
sdlog_s <- fit_ln$estimate["sdlog"]
# Curva suave Log-Normal
x <- seq(min(Solar), max(Solar), length.out = 100)
curve(dlnorm(x, meanlog = meanlog_s, sdlog = sdlog_s), type="l", add=TRUE, lwd=4, col="black")

# Frecuencia simple observada (Basada en la agrupación de 5 en 5)
Fo <- histograma$counts
# Frecuencia simple esperada usando plnorm
P <- c(0)
for (i in 1:h) {
P[i] <- (plnorm(histograma$breaks[i+1], meanlog_s, sdlog_s) -
plnorm(histograma$breaks[i], meanlog_s, sdlog_s))
}
Fe <- P * length(Solar)
# Comparar tamaño real y el modelo
sum(Fe)
## [1] 186.9093
n <- length(Solar)
# 2. Test de Pearson
plot(Fo, Fe, main="Gráfica 105: Correlación de frecuencias en el modelo Log-Normal (Rango 5-20)",
xlab="Frecuencia Observada", ylab="Frecuencia esperada", col="blue3", pch=19)
abline(lm(Fe ~ Fo), col="red", lwd=2)

Correlación <- cor(Fo, Fe) * 100
Correlación
## [1] 92.11068
#TEST DE CHI-CUADRADO
# Al tener 3 intervalos, los grados de libertad serán 2
grados_libertad <- (length(histograma$counts)-1)
nivel_significancia <- 0.05
x2 <- sum((Fe - Fo)^2 / Fe)
umbral_aceptacion <- qchisq(1 - nivel_significancia, grados_libertad)
x2 < umbral_aceptacion
## [1] TRUE
#3 Tabla resumen de test
Variable <- c("Solar (5-20)")
tabla_resumen <- data.frame(Variable, round(Correlación, 2), round(x2, 2), round(umbral_aceptacion, 2))
colnames(tabla_resumen) <- c("Variable", "Test Pearson (%)", "Chi Cuadrado", "Umbral de aceptación")
kable(tabla_resumen, format = "markdown", caption = "Tabla.Resumen de test para Radiación Solar (Segmento 5-20)")
Tabla.Resumen de test para Radiación Solar (Segmento
5-20)
| Solar (5-20) |
92.11 |
8.55 |
9.49 |
# 4. Cálculo de probabilidades corregido
limite_inf <- 10
limite_sup <- 15
prob_area <- plnorm(limite_sup, meanlog_s, sdlog_s) - plnorm(limite_inf, meanlog_s, sdlog_s)
x_grafica <- seq(min(Solar), max(Solar), length.out = 1000)
y_grafica <- dlnorm(x_grafica, meanlog_s, sdlog_s)
# GRAFICAR
plot(x_grafica, y_grafica, type = "l", col = "skyblue3", lwd = 2,
main="Distribución Log-Normal de Radiación (Filtro 5-20)",
ylab="Densidad de Probabilidad",
xlab="MJ/m2",
xaxt="n")
# Sombreado de la probabilidad
x_sombra <- seq(limite_inf, limite_sup, length.out = 100)
y_sombra <- dlnorm(x_sombra, meanlog_s, sdlog_s)
polygon(c(x_sombra, rev(x_sombra)), c(y_sombra, rep(0, length(y_sombra))),
col = rgb(1, 0, 0, 0.4), border = "red")
# Eje X con saltos de 5 en 5 empezando desde 5
axis(1, at = cortes, las = 2)
# Leyenda explicativa
legend("topright",
legend = c("Modelo Log-Normal", paste("Probabilidad:", round(prob_area*100, 2), "%")),
fill = c(NA, rgb(1, 0, 0, 0.4)), border = c("skyblue3", "red"), bty = "n")
