El objetivo del presente programa es a partir de una base de datos estimar la “Energia obtenida” usando el método de cuadrados mínimos.
Inicialmente se eligió el directorio de trabajo (1), se absorbieron los datos de la tabla (2), y se testeó la existencia de celdas vacías (NA) (3).
rm(list = ls())
library(datasets)
library("leaps")
library(olsrr)
##
## Adjuntando el paquete: 'olsrr'
## The following object is masked from 'package:datasets':
##
## rivers
setwd("C:/Users/marco/Documents/Rscripts") #1
par(mfrow=c(1,1))
datos<-read.csv("planta.csv", header=TRUE, dec=".") #2
datos_vaglica<- datos[4001:6000,]
names(datos_vaglica)
## [1] "X" "Obs" "T_ambiente" "T_modulo"
## [5] "Irradiacion" "Potencia_AC" "Potencia_CC" "Energia_obtenida"
NotAvaliable<-is.na(datos_vaglica)
which(NotAvaliable%in%TRUE) #3
## integer(0)
datos<-datos_vaglica
Para poder conocer las variables a utilizar, debemos visualizar sus distribuciones, para lo que se hizo un “gráfico de violin” combinado, el que representa en el eje y el valor nominal de los datos y su función de distribución (en colores). En el mismo gráfico se agregaron los gráficos de cajas y bigotes correspondientes a cada variable, en el que se pueden observar algunos datos anómalos (outliers) en las variables Temp ambiente, Temp módulo y Potencia AC.
#install.packages("tidyr")
library(tidyr)
library(ggplot2)
data_long <- pivot_longer(datos,
cols = c(T_ambiente, T_modulo, Irradiacion, Potencia_AC, Potencia_CC, Energia_obtenida),
names_to = "Grupo",
values_to = "Valor")
# Crear el gráfico de violín con boxplots
ggplot(data_long, aes(x = Grupo, y = Valor, fill = Grupo)) +
geom_violin(trim = FALSE, alpha = 0.5) + # Gráfico de violín con transparencia
geom_boxplot(width = 0.1, color = "black", alpha = 0.7) + # Boxplot encima del violín
labs(title = "Gráfico de Violín con Boxplot por Variable", x = "Variable", y = "Valor") +
theme_minimal() +
facet_wrap(~Grupo, scales = "free") # Facetas por variable y escalas independientes
Para poder encontrar los datos anómalos mencionados en la etapa anterior, se realizó el gráfico de caja y bigotes correspondiente a cada variabe , posteriormente se filtraron estos mismos, eliminandolos de la base de datos inicial.
# Boxplot para T_ambiente
boxplot(datos$T_ambiente,
main = "Boxplot de Temperatura Ambiente",
xlab = "Temperatura Ambiente (°C)",
ylab = "Frecuencia",
outline = TRUE) # centrada con outliers a la izquierda y derecha
outliers <- boxplot.stats(datos$T_ambiente)$out
datos_borrar <- which(datos$T_ambiente %in% outliers)
datos_filtrados <- datos[-datos_borrar, ]
datos <- datos_filtrados
# Boxplot después de filtrar outliers
boxplot(datos$T_ambiente,
main = "Boxplot de Temperatura Ambiente (Filtrados)",
xlab = "Temperatura Ambiente (°C)",
ylab = "Frecuencia",
outline = TRUE) # 18 outliers filtrados
# Boxplot para T_modulo
boxplot(datos$T_modulo,
main = "Boxplot de Temperatura del Módulo",
xlab = "Temperatura del Módulo (°C)",
ylab = "Frecuencia",
outline = TRUE) # varios outliers a la derecha por encima de 75
outliers <- datos$T_modulo[datos$T_modulo > 74.5]
datos_borrar <- which(datos$T_modulo %in% outliers)
datos_filtrados <- datos[-datos_borrar, ]
datos <- datos_filtrados
# Boxplot después de filtrar outliers
boxplot(datos$T_modulo,
main = "Boxplot de Temperatura del Módulo (Filtrados)",
xlab = "Temperatura del Módulo (°C)",
ylab = "Frecuencia",
outline = TRUE) # outliers filtrados
# Boxplot para Potencia_AC
boxplot(datos$Potencia_AC,
main = "Boxplot de Potencia AC",
xlab = "Potencia AC (W)",
ylab = "Frecuencia",
outline = TRUE) # dos outliers a la derecha
outliers <- boxplot.stats(datos$Potencia_AC)$out
datos_borrar <- which(datos$Potencia_AC %in% outliers)
datos_filtrados <- datos[-datos_borrar, ]
datos <- datos_filtrados
# Boxplot después de filtrar outliers
boxplot(datos$Potencia_AC,
main = "Boxplot de Potencia AC (Filtrados)",
xlab = "Potencia AC (W)",
ylab = "Frecuencia",
outline = TRUE) # 2 outliers filtrados
Se volvió a realizar el gráfico de violín conjugado para comprobar la desaparición de los outliers, donde se observa que asi sucede.
data_long <- pivot_longer(datos,
cols = c(T_ambiente, T_modulo, Irradiacion, Potencia_AC, Potencia_CC, Energia_obtenida),
names_to = "Grupo",
values_to = "Valor")
# Crear el gráfico de violín con boxplots
ggplot(data_long, aes(x = Grupo, y = Valor, fill = Grupo)) +
geom_violin(trim = FALSE, alpha = 0.5) + # Gráfico de violín con transparencia
geom_boxplot(width = 0.1, color = "black", alpha = 0.7) + # Boxplot encima del violín
labs(title = "Gráfico de Violín con Boxplot por Variable", x = "Variable", y = "Valor") +
theme_minimal() +
facet_wrap(~Grupo, scales = "free") # Facetas por variable y escalas independientes
Inicialmente se realizó un grafico de regresión combinada entre todas las variables, donde puede observarse a simple vista una relación cuadrática entre la variable “Irradiación” y “Energia Obtenida”, y una leve correlación lineal entre Potencia AC y Potencia CC.
#install.packages("GGally")
library(GGally)
## Registered S3 method overwritten by 'GGally':
## method from
## +.gg ggplot2
ggpairs(datos,
columns = 3:ncol(datos), # Selecciona solo las columnas a partir de la 3ra
lower = list(continuous = wrap("smooth", alpha = 0.3)), # Gráficos con un poco de transparencia
upper = list(continuous = wrap("cor", size = 5)), # Correlaciones con tamaño de texto
title = "Gráfico de Pares con Regresiones entre Todas las Variables",
axisLabels = "show") # Mostrar etiquetas en los ejes
Aqui podemos conocer numericamente la correlación lineal entre todas las variables predictoras y la Energía obtenida. Donde se puede observar una sólida correlación entre Irradiación y Energía, una correlación media entre Potencia AC y CC (77%) y una correlación considerable entre Temp ambiente y módulo (50%).
#install.packages("corrplot")
library(corrplot)
## corrplot 0.94 loaded
matriz_correlacion <- cor(datos[, -1], use = "complete.obs") # Excluir la primera columna
# Crear el gráfico de correlación
corrplot(matriz_correlacion,
method = "circle", # Método para graficar
type = "upper", # Solo la parte superior del gráfico
addCoef.col = "black", # Color de los coeficientes
tl.col = "black", # Color de las etiquetas de texto
tl.srt = 45, # Rotar las etiquetas de texto
diag = FALSE) # Opcional: ocultar la diagonal
Aquí buscamos modelos para predecir la Energía obtenida en función de las demás variables (5). Como requisitos necesitamos encontrar uno que tenga RSE<3500 y R^2<0.99.
Este modelo estima la Energia en función de todas demás variables. A continuación podemos ver el sumario del modelo obtenido, el cual nos indica con el “P Valor” la significancia de cada variable en el modelo lineal, siendo este menor que 0.05 variable significante y mayor a 0.05 variable no significante. En este caso el P Valor de Potencia AC y CC son 0.86 y 0.76 respectivamente, por lo que son sumamente no significantes en este modelo.
attach(datos)
modelo<-lm(Energia_obtenida~T_ambiente+T_modulo+Irradiacion+Potencia_AC
+Potencia_CC)
summary(modelo)
##
## Call:
## lm(formula = Energia_obtenida ~ T_ambiente + T_modulo + Irradiacion +
## Potencia_AC + Potencia_CC)
##
## Residuals:
## Min 1Q Median 3Q Max
## -16327 -10826 -2196 8525 78578
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -1.239e+05 1.178e+04 -10.512 <2e-16 ***
## T_ambiente -2.240e+02 1.799e+02 -1.245 0.213
## T_modulo -3.013e+02 1.849e+02 -1.630 0.103
## Irradiacion 1.278e+04 6.178e+01 206.897 <2e-16 ***
## Potencia_AC 1.015e+00 2.745e+00 0.370 0.712
## Potencia_CC 9.497e-02 4.132e-01 0.230 0.818
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 12280 on 1968 degrees of freedom
## Multiple R-squared: 0.9566, Adjusted R-squared: 0.9565
## F-statistic: 8684 on 5 and 1968 DF, p-value: < 2.2e-16
Como las potencias tienen una relación lineal baja con la Energía las desestimamos en este nuevo modelo. Sin embargo no se encontró aún un modelo que cuimpla con los requisitos. Para determinar si el modelo lineal ajusta correctamente se graficaron los residuos, en donde se observa una relación cuadrática.
modelo<-lm(Energia_obtenida~T_ambiente+T_modulo+Irradiacion)
summary(modelo)
##
## Call:
## lm(formula = Energia_obtenida ~ T_ambiente + T_modulo + Irradiacion)
##
## Residuals:
## Min 1Q Median 3Q Max
## -16165 -10827 -2339 8448 79023
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -119949.35 10880.08 -11.025 <2e-16 ***
## T_ambiente -223.84 179.76 -1.245 0.2132
## T_modulo -306.37 184.72 -1.659 0.0974 .
## Irradiacion 12780.03 61.72 207.060 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 12280 on 1970 degrees of freedom
## Multiple R-squared: 0.9566, Adjusted R-squared: 0.9566
## F-statistic: 1.448e+04 on 3 and 1970 DF, p-value: < 2.2e-16
plot(modelo$fitted.values, modelo$residuals)
outlier<-which.max(modelo$residuals) #elimino outlier que se ve en el gráfico arriba a la izquierda
datos_filtrados <- datos[-outlier, ]
datos <- datos_filtrados
Observación: se eliminó el outlier que se hizo presente arriba a la izquierda en el gráfico.
Debido a que el mejor predictor de la Energía es la Irradiación (correlación), se decidió ajustar mejor esta variable, por lo que se tuvo en cuenta la relación cuadrática existente entre estas dos variables. Por lo que se generó una variable llamada “Irradiación^2” y se sumo al modelo lineal 2. Como consecuencia, se encontró un modelo (3) que cumple con los requisitos. Sin embargo no sabemos si este es el modelo que mejor ajusta. En el gráfico podemos observar que ahora los residuos ajustan mejor que en el modelo lineal puro (sin irradiación^2).
attach(datos)
## The following objects are masked from datos (pos = 3):
##
## Energia_obtenida, Irradiacion, Obs, Potencia_AC, Potencia_CC,
## T_ambiente, T_modulo, X
modelo<-lm(Energia_obtenida~T_ambiente+T_modulo+Irradiacion+I(Irradiacion^2))
summary(modelo)
##
## Call:
## lm(formula = Energia_obtenida ~ T_ambiente + T_modulo + Irradiacion +
## I(Irradiacion^2))
##
## Residuals:
## Min 1Q Median 3Q Max
## -3539.9 -933.3 -98.2 838.0 5012.1
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 93209.552 1284.043 72.591 < 2e-16 ***
## T_ambiente 140.852 19.361 7.275 4.98e-13 ***
## T_modulo -426.917 19.877 -21.478 < 2e-16 ***
## Irradiacion -12178.407 61.894 -196.761 < 2e-16 ***
## I(Irradiacion^2) 674.286 1.662 405.756 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1321 on 1968 degrees of freedom
## Multiple R-squared: 0.9995, Adjusted R-squared: 0.9995
## F-statistic: 9.804e+05 on 4 and 1968 DF, p-value: < 2.2e-16
plot(modelo$fitted.values, modelo$residuals)
Observación: el RSE de este modelo es 1984 y el R^2 0.9989 y todas las variables son altamente significativas (P Valor<0.001). Los residuos poseen una distribución más aleatoria en comparación con el modelo 2.
Para determinar cual es el mejor modelo de estimación se consideraron todas las combinaciones posibles de variables, incluyendo la forma cuadrática de la irradiación. Se evaluó suma de residuos al cuadrado (RSS), R^2 ajustado y Cp Ajustado.
#install.packages("leaps")
#install.packages("olsrr")
library("leaps")
library(olsrr)
model_subset<-regsubsets(Energia_obtenida~T_ambiente+T_modulo+Irradiacion+I(Irradiacion^2)+Potencia_AC+Potencia_CC,data=datos)
model_subset$call
## regsubsets.formula(Energia_obtenida ~ T_ambiente + T_modulo +
## Irradiacion + I(Irradiacion^2) + Potencia_AC + Potencia_CC,
## data = datos)
summary(model_subset)$which ## me devuelve los modelo ajustados
## (Intercept) T_ambiente T_modulo Irradiacion I(Irradiacion^2) Potencia_AC
## 1 TRUE FALSE FALSE FALSE TRUE FALSE
## 2 TRUE FALSE FALSE TRUE TRUE FALSE
## 3 TRUE FALSE TRUE TRUE TRUE FALSE
## 4 TRUE TRUE TRUE TRUE TRUE FALSE
## 5 TRUE TRUE TRUE TRUE TRUE TRUE
## 6 TRUE TRUE TRUE TRUE TRUE TRUE
## Potencia_CC
## 1 FALSE
## 2 FALSE
## 3 FALSE
## 4 FALSE
## 5 FALSE
## 6 TRUE
##criterio Suma de residuos al cuadrado, elijo el minimo.
summary(model_subset)$rss ## RSS suma de residuos al cuadrado
## [1] 71968503727 4260105633 3524715037 3432408281 3432001718 3430467084
which.min(summary(model_subset)$rss) #modelo 6
## [1] 6
summary(model_subset)$which[6,] ## veo cual es el modelo 6
## (Intercept) T_ambiente T_modulo Irradiacion
## TRUE TRUE TRUE TRUE
## I(Irradiacion^2) Potencia_AC Potencia_CC
## TRUE TRUE TRUE
## criterio R^2 ajustado, elijo el mayor
summary(model_subset)$adjr2
## [1] 0.9894780 0.9993768 0.9994842 0.9994974 0.9994972 0.9994972
which.max(summary(model_subset)$adjr2)## modelo 4
## [1] 4
summary(model_subset)$which[4,] ## veo cual es el modelo 4
## (Intercept) T_ambiente T_modulo Irradiacion
## TRUE TRUE TRUE TRUE
## I(Irradiacion^2) Potencia_AC Potencia_CC
## TRUE FALSE FALSE
## criterio Cp ajustado, elijo el menor
summary(model_subset)$cp
## [1] 39276.135096 474.465687 55.013483 4.112500 5.879498
## [6] 7.000000
which.min(summary(model_subset)$cp) ##modelo 4
## [1] 4
summary(model_subset)$which[4,] # veo cual es el modelo
## (Intercept) T_ambiente T_modulo Irradiacion
## TRUE TRUE TRUE TRUE
## I(Irradiacion^2) Potencia_AC Potencia_CC
## TRUE FALSE FALSE
summary(model_subset)
## Subset selection object
## Call: regsubsets.formula(Energia_obtenida ~ T_ambiente + T_modulo +
## Irradiacion + I(Irradiacion^2) + Potencia_AC + Potencia_CC,
## data = datos)
## 6 Variables (and intercept)
## Forced in Forced out
## T_ambiente FALSE FALSE
## T_modulo FALSE FALSE
## Irradiacion FALSE FALSE
## I(Irradiacion^2) FALSE FALSE
## Potencia_AC FALSE FALSE
## Potencia_CC FALSE FALSE
## 1 subsets of each size up to 6
## Selection Algorithm: exhaustive
## T_ambiente T_modulo Irradiacion I(Irradiacion^2) Potencia_AC
## 1 ( 1 ) " " " " " " "*" " "
## 2 ( 1 ) " " " " "*" "*" " "
## 3 ( 1 ) " " "*" "*" "*" " "
## 4 ( 1 ) "*" "*" "*" "*" " "
## 5 ( 1 ) "*" "*" "*" "*" "*"
## 6 ( 1 ) "*" "*" "*" "*" "*"
## Potencia_CC
## 1 ( 1 ) " "
## 2 ( 1 ) " "
## 3 ( 1 ) " "
## 4 ( 1 ) " "
## 5 ( 1 ) " "
## 6 ( 1 ) "*"
Observación: El criterio RSS eligió al modelo con todas las variables (6), mientras que el criterio R^2 y Cp eligió el modelo con 4 variables (4), las cuales son las mismas que en el “modelo lineal 3”.
attach(datos)
## The following objects are masked from datos (pos = 3):
##
## Energia_obtenida, Irradiacion, Obs, Potencia_AC, Potencia_CC,
## T_ambiente, T_modulo, X
## The following objects are masked from datos (pos = 4):
##
## Energia_obtenida, Irradiacion, Obs, Potencia_AC, Potencia_CC,
## T_ambiente, T_modulo, X
modelo4<-lm(Energia_obtenida~T_ambiente+T_modulo+Irradiacion+I(Irradiacion^2))
summary(modelo4)
##
## Call:
## lm(formula = Energia_obtenida ~ T_ambiente + T_modulo + Irradiacion +
## I(Irradiacion^2))
##
## Residuals:
## Min 1Q Median 3Q Max
## -3539.9 -933.3 -98.2 838.0 5012.1
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 93209.552 1284.043 72.591 < 2e-16 ***
## T_ambiente 140.852 19.361 7.275 4.98e-13 ***
## T_modulo -426.917 19.877 -21.478 < 2e-16 ***
## Irradiacion -12178.407 61.894 -196.761 < 2e-16 ***
## I(Irradiacion^2) 674.286 1.662 405.756 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1321 on 1968 degrees of freedom
## Multiple R-squared: 0.9995, Adjusted R-squared: 0.9995
## F-statistic: 9.804e+05 on 4 and 1968 DF, p-value: < 2.2e-16
AICmod4<-AIC(modelo4)
BICmod4<-BIC(modelo4)
modelo6<-lm(Energia_obtenida~T_ambiente+T_modulo+Irradiacion+I(Irradiacion^2)+Potencia_AC+Potencia_CC)
summary(modelo6)
##
## Call:
## lm(formula = Energia_obtenida ~ T_ambiente + T_modulo + Irradiacion +
## I(Irradiacion^2) + Potencia_AC + Potencia_CC)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3541.2 -945.7 -98.9 827.7 4994.9
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 9.343e+04 1.376e+03 67.898 < 2e-16 ***
## T_ambiente 1.404e+02 1.937e+01 7.246 6.16e-13 ***
## T_modulo -4.273e+02 1.989e+01 -21.479 < 2e-16 ***
## Irradiacion -1.218e+04 6.192e+01 -196.686 < 2e-16 ***
## I(Irradiacion^2) 6.743e+02 1.662e+00 405.621 < 2e-16 ***
## Potencia_AC -3.046e-01 2.955e-01 -1.031 0.303
## Potencia_CC 4.169e-02 4.445e-02 0.938 0.348
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1321 on 1966 degrees of freedom
## Multiple R-squared: 0.9995, Adjusted R-squared: 0.9995
## F-statistic: 6.533e+05 on 6 and 1966 DF, p-value: < 2.2e-16
AICmod6<-AIC(modelo6)
BICmod6<-BIC(modelo6)
# Comparar AIC de ambos modelos
if (AICmod4 < AICmod6) {
print("El modelo 4 es el mejor (menor AIC).")
} else if (AICmod4 > AICmod6) {
print("El modelo 6 es el mejor (menor AIC).")
} else {
print("Ambos modelos tienen el mismo AIC.")
}
## [1] "El modelo 4 es el mejor (menor AIC)."
# Comparar BIC de ambos modelos
if (BICmod4 < BICmod6) {
print("El modelo 4 es el mejor (menor BIC).")
} else if (AICmod4 > AICmod6) {
print("El modelo 6 es el mejor (menor BIC).")
} else {
print("Ambos modelos tienen el mismo BIC.")
}
## [1] "El modelo 4 es el mejor (menor BIC)."
Observación: el modelo 4 tiene menor BIC y menor AIC frente al 6 por ende ambos criterios eligen el modelo 4. Por ende el modelo seleccionado será el número 4
set.seed(12)
n<-nrow(datos)
indices<- sample(n* 0.7, replace = FALSE)
entrenamiento<-datos[indices,]
ind<-datos[-indices,]
modelo4<-lm(Energia_obtenida~T_ambiente+T_modulo+Irradiacion+I(Irradiacion^2), data=entrenamiento)
predichos4<-predict(modelo4, ind)
ecm4<-mean((ind$Energia_obtenida-predichos4)^2,na.rm=TRUE)
modelo6<-lm(Energia_obtenida~T_ambiente+T_modulo+Irradiacion+I(Irradiacion^2)+Potencia_AC+Potencia_CC,data=entrenamiento)
predichos6<-predict(modelo6, ind)
ecm6<-mean((ind$Energia_obtenida-predichos6)^2,na.rm=TRUE)
# Comparar ECM de ambos modelos
if (ecm4 < ecm6) {
print("El modelo 4 es el mejor (menor ECM).")
} else if (ecm4 > ecm6) {
print("El modelo 6 es el mejor (menor ECM).")
} else {
print("Ambos modelos tienen el mismo ECM.")
}
## [1] "El modelo 4 es el mejor (menor ECM)."
print(ecm4)
## [1] 1531899
print(ecm6)
## [1] 1549637
Observación: El modelo 6 tiene menor ECM (1006887) frente al modelo 4 (1010893)
EL intervalo de predicción para el punto (“T_ambiente= 35 ;“T_modulo”= 60; “Irradiacion”= 25; “Potencia_AC” =2500; “Potencia_CC”= 13000) es (186883,192108) usando el modelo 4.
nuevo_dato <- data.frame(T_ambiente = 35,
T_modulo = 60,
Irradiacion = 25,
Potencia_AC = 2500,
Potencia_CC = 13000)
str(nuevo_dato)
## 'data.frame': 1 obs. of 5 variables:
## $ T_ambiente : num 35
## $ T_modulo : num 60
## $ Irradiacion: num 25
## $ Potencia_AC: num 2500
## $ Potencia_CC: num 13000
prediccion_con_intervalo <- predict(modelo4,
newdata = nuevo_dato,
interval = "prediction")
print(prediccion_con_intervalo)
## fit lwr upr
## 1 189609.7 186860.2 192359.2
En este trabajo se ha llevado a cabo un análisis exhaustivo para estimar la “Energía obtenida” a partir de diversas variables utilizando modelos de regresión lineal. Se inició el proceso con la identificación y filtrado de outliers, asegurando así la calidad de los datos. Posteriormente, se exploraron diferentes combinaciones de variables predictoras y se evaluaron sus desempeños a través de criterios estadísticos como el Error Cuadrático Medio (ECM), AIC y BIC.
Los resultados revelaron que el modelo que mejor se ajusta a los datos es el modelo 4, que incluye las variables de “Temperatura ambiente”, “Temperatura del módulo” e “Irradiación”, junto con una forma cuadrática de “Irradiación”. Este modelo no solo cumple con los requisitos establecidos de RSE y R², sino que también muestra una gran significancia estadística en sus coeficientes, lo que sugiere una fuerte relación con la variable dependiente.
Cómo el modelo 6 (todas las variables) es mejor según el criterio del RSS, se validó este junto al modelo 4 para determinar cual se comporta mejor empleando datos de entrenamiento (70%) y datos de validación (30%), con lo que se obtubo un ECM menor con el modelo 4, por lo que refuerza la elección de este ultimo.
Finalmente, se calculó un intervalo de predicción para un conjunto específico de valores, proporcionando una herramienta útil para la estimación de la energía bajo condiciones dadas. En conclusión, este análisis no solo demuestra la utilidad de la regresión lineal en la modelización de relaciones complejas, sino que también subraya la importancia de un enfoque metódico en la selección y validación de modelos.