Introducción

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.

ANÁLISIS DE OUTLIERS

Inicio

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

Distribución de las observaciones por cada variable

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

Análisis y filtro de outliers

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

Distribución de variables sin outliers

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

IDENTIFICACIÓN DE VARIABLES SIGNIFICATIVAS

Regresión combinada

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

Gráfico de correlacioón combinada

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

MODELOS DE REGRESIÓN LINEAL

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.

Modelo lineal 1 (todas las variables)

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

Modelo lineal 2 (Energía en función de Temp ambiente, Temp módulo e Irradiación)

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.

Modelo lineal 3 (Energía en función de Temp ambiente, Temp módulo, Irradiación e Irradiación^2)

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.

Todos los modelos lineales

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”.

Calculo de AIS y BIS para los modelos seleccionados (4)+(6)

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

ECM 4 vs 6 (Entrenamiento 70% - Validación 30%)

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)

Hallar un intervalo de predicción para un punto

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

CONCLUSIÓN

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.