Selección del modelo

Introducción

Para un conjunto de \(p-1\) variables regresoras, se pueden construir \(2^{p-1}\) modelos. En la mayoría de circunstancias es imposible para un analista hacer una revisión detallada de todos los modelos posibles. Por ejemplo, si se tienen \(10\) variables regresoras, se podrían construir \(2^{10}=1024\) modelos. En este sentido la utilización de software estadístico toma importancia.

El procedimiento de selección de modelos, también conocido como selección de variables, se han desarrollado para identificar un grupo de modelos de regresión que son buenos según un criterio o métrica

Muchos criterios han sido desarrollados para comparar modelos de regresión. Algunos de ellos serán vistos en esta sección del curso.

Notación.

  • \(P-1\): número total de variables regresoras \(X\).

  • Se asume que los modelos a comparar poseen término \(\beta_0\). Por lo tanto, la función de regresión contiene a todas las variables regresoras potencias \(X\) y los \(P\) parámetros.

  • El número de variables regresoras \(X\) en un submodelo será denotado por \(p-1\). De modo que hay \(p\) parámetros en la función de regresión para un submodelo con un subconjunto de variables \(X\). Esto es:

\[\begin{align} 1 \leq p \leq P \end{align} \tag{1}\]

  • Se asume que el número de observaciones excede el máximo número de parámetros \(\beta\) potenciales.

\[\begin{align} n>p \end{align} \tag{2}\]

De hecho, es deseable que \(n\) sea mucho mayor que \(p\) para obtener resultados sólidos.

Criterio \(R_p^2\)

El criterio \(R_p^2\) usa el coeficiente de determinación múltiple, que se muestra en la Ecuación 3:

\[\begin{align} R^2 = \frac{SSR}{SST} = 1- \frac {SSE}{SST} \end{align} \tag{3}\]

\(R_p^2\) se muestra en la Ecuación 4

\[\begin{align} R_p^2 = 1- \frac {SSE_p}{SST} \end{align} \tag{4}\]

\(R_p^2\) indica que hay \(p\) parámetros o \(p-1\) variables \(X\).

El criterio \(R_p^2\) no pretende identificar los subconjuntos que maximizan este criterio. \(R_p^2\) nunca puede disminuir a medida que se incluyen variables \(X\) adicionales en el modelo. Por lo tanto, \(R_p^2\) será máximo cuando todas las \(P - 1\) variables \(X\) potenciales se incluyan en el modelo de regresión. La intención al utilizar el criterio \(R_p^2\) es encontrar el punto en el que añadir más variables \(X\) no merece la pena porque conduce a un aumento muy pequeño de \(R_p^2\). A menudo, este punto se alcanza cuando sólo se incluye un número limitado de variables \(X\) en el modelo de regresión. Evidentemente, la determinación del punto en el que aparecen los rendimientos decrecientes es una cuestión de juicio.

Ejemplo cálculo \(R_p^2\)

#Datos
library(readxl)
datos <- read_excel("data_cirugia.xlsx")
datos$genero <- as.factor(datos$genero)
datos$uso_alcohol_moderado <- as.factor(datos$uso_alcohol_moderado)
datos$uso_alcohol_exceso <- as.factor(datos$uso_alcohol_exceso)

#Modelo con X1, X2, X3, p=4
modelo <- lm(datos$ln_tiempo_supervivencia~datos$coagulacion_score+datos$indice_pronostico+datos$test_enzimas)

# ANOVA para SST, SSR, SSE
anova <- aov(modelo)
resumen <- summary(anova)
SSE <- resumen[[1]]$`Sum Sq`[4]
SST <-resumen[[1]]$`Sum Sq`[1]+resumen[[1]]$`Sum Sq`[2]+resumen[[1]]$`Sum Sq`[3]+resumen[[1]]$`Sum Sq`[4]
r2 <- 1- (SSE/SST)
r2
[1] 0.7572331
# Con sentencias de R
summary(modelo)

Call:
lm(formula = datos$ln_tiempo_supervivencia ~ datos$coagulacion_score + 
    datos$indice_pronostico + datos$test_enzimas)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.46994 -0.17938 -0.03116  0.17959  0.59105 

Coefficients:
                        Estimate Std. Error t value Pr(>|t|)    
(Intercept)             3.766441   0.226757  16.610  < 2e-16 ***
datos$coagulacion_score 0.095475   0.021692   4.401 5.66e-05 ***
datos$indice_pronostico 0.013344   0.002035   6.558 2.95e-08 ***
datos$test_enzimas      0.016444   0.001630  10.089 1.19e-13 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.2493 on 50 degrees of freedom
Multiple R-squared:  0.7572,    Adjusted R-squared:  0.7427 
F-statistic: 51.99 on 3 and 50 DF,  p-value: 2.137e-15

Criterio \(R^2_p~ajustado\)

Como el \(R_p^2\) no tiene en cuenta el número de parámetros del modelo de regresión y el \(max(R_p^2)\) no decrece cuando la cantidad de parámetros \(p\) incrementa, el coeficiente de determinación ajustado, \(R^2_{ap}\) (Ecuación 5), resulta de mucha utilidad

\[R^2_{ap}= 1- \frac{n-1}{n-p} \frac{SSE_p}{SST}= 1- \frac{MSE_p}{\frac{SST}{n-1}} \tag{5}\]

De la Ecuación 5 se puede observar que el \(R^2_{ap}\) incrementa si y solo si \(MSE_p\) decrece.

\(R^2_{ap}\) incrementa si y solo si al agregar una variable al modelo el ajuste mejora.

Al comparar entre dos modelos, se considera que el de mayor \(R^2_{ap}\) es mejor.

Ejemplo cálculo \(R^2_{ap}\)

#Datos
library(readxl)
datos <- read_excel("data_cirugia.xlsx")
datos$genero <- as.factor(datos$genero)
datos$uso_alcohol_moderado <- as.factor(datos$uso_alcohol_moderado)
datos$uso_alcohol_exceso <- as.factor(datos$uso_alcohol_exceso)

#Modelo con X1, X2, X3, p=4
modelo <- lm(datos$ln_tiempo_supervivencia~datos$coagulacion_score+datos$indice_pronostico+datos$test_enzimas)

# ANOVA para MSE, SST
anova <- aov(modelo)
resumen <- summary(anova)
SSE <- resumen[[1]]$`Sum Sq`[4]
n <- nrow(datos)
p <- length(coef(modelo))
MSE <- SSE/(n-p)
SST <-resumen[[1]]$`Sum Sq`[1]+resumen[[1]]$`Sum Sq`[2]+resumen[[1]]$`Sum Sq`[3]+resumen[[1]]$`Sum Sq`[4]
r2_ajustado <- 1- (MSE/(SST/53))
r2_ajustado
[1] 0.7426671
# Con sentencias de R
summary(modelo)

Call:
lm(formula = datos$ln_tiempo_supervivencia ~ datos$coagulacion_score + 
    datos$indice_pronostico + datos$test_enzimas)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.46994 -0.17938 -0.03116  0.17959  0.59105 

Coefficients:
                        Estimate Std. Error t value Pr(>|t|)    
(Intercept)             3.766441   0.226757  16.610  < 2e-16 ***
datos$coagulacion_score 0.095475   0.021692   4.401 5.66e-05 ***
datos$indice_pronostico 0.013344   0.002035   6.558 2.95e-08 ***
datos$test_enzimas      0.016444   0.001630  10.089 1.19e-13 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.2493 on 50 degrees of freedom
Multiple R-squared:  0.7572,    Adjusted R-squared:  0.7427 
F-statistic: 51.99 on 3 and 50 DF,  p-value: 2.137e-15

Criterio \(C_p\) de Mallow

El criterio \(C_p\) de Mallow se calcula según la Ecuación 6.

\[\begin{align} C_p = \frac{SSE_p}{MSE(X_1,X_2,...X_{p-1})} - (n-2p) \end{align} \tag{6}\]

Donde \(SSE_p\) es la suma de cuadrados del error para el submodelo ajustado con \(p\) parámetros.

Valores de \(C_p\) cercanos a \(p\) son interpretados como que no muestran sesgo.

En el contexto de la regresión lineal el sesgo En el contexto de modelos de regresión y otros modelos predictivos, el sesgo es el error que proviene de la simplificación excesiva del modelo, como cuando no se incluyen variables importantes. Por ejemplo, si se usa un modelo lineal para datos que en realidad tienen una relación no lineal, el modelo tendrá un sesgo alto.

Si se usa el criterio \(C_p\) para selección de variables y modelos se debe observar:

  1. El valor de \(C_p\) es bajo.

  2. \(C_p\) es cercano a \(p\).

Ejemplo de cálculo de \(C_p\) de Mallow.

#Datos
library(readxl)
datos <- read_excel("data_cirugia.xlsx")
datos$genero <- as.factor(datos$genero)
datos$uso_alcohol_moderado <- as.factor(datos$uso_alcohol_moderado)
datos$uso_alcohol_exceso <- as.factor(datos$uso_alcohol_exceso)

#Modelo completo con X1, X2, X3, X4, p=5 
modelo_completo <- lm(datos$ln_tiempo_supervivencia~datos$coagulacion_score+datos$indice_pronostico+datos$test_enzimas+datos$test_higado)

#Modelo que solo tiene X4
modelo <- lm(datos$ln_tiempo_supervivencia~datos$test_higado)

# MSE del modelo completo
anova_completo <- aov(modelo_completo)
resumen_completo <- summary(anova_completo)
MSE <- resumen_completo[[1]]$`Mean Sq`[5]

# SSE modelo con X4
anova <- aov(modelo)
resumen <- summary(anova)
SSE <- resumen[[1]]$`Sum Sq`[2]

# Cp
n <- nrow(datos)
p<-length(coef(modelo))
c_p <- (SSE/MSE)-(n-(2*p))
c_p
[1] 67.69589
#Con sentencias de R
library(olsrr)
resultados <- ols_mallows_cp(modelo,modelo_completo)

# Cp con todos los posibles modelos
library(olsrr)
resultados_todos <- ols_step_all_possible(modelo_completo)
cp_todos<-c(resultados_todos$result[3],resultados_todos$result[8])
print(cp_todos)
$predictors
 [1] "datos$test_enzimas"                                                                  
 [2] "datos$test_higado"                                                                   
 [3] "datos$indice_pronostico"                                                             
 [4] "datos$coagulacion_score"                                                             
 [5] "datos$indice_pronostico datos$test_enzimas"                                          
 [6] "datos$test_enzimas datos$test_higado"                                                
 [7] "datos$coagulacion_score datos$test_enzimas"                                          
 [8] "datos$indice_pronostico datos$test_higado"                                           
 [9] "datos$coagulacion_score datos$test_higado"                                           
[10] "datos$coagulacion_score datos$indice_pronostico"                                     
[11] "datos$coagulacion_score datos$indice_pronostico datos$test_enzimas"                  
[12] "datos$indice_pronostico datos$test_enzimas datos$test_higado"                        
[13] "datos$coagulacion_score datos$test_enzimas datos$test_higado"                        
[14] "datos$coagulacion_score datos$indice_pronostico datos$test_higado"                   
[15] "datos$coagulacion_score datos$indice_pronostico datos$test_enzimas datos$test_higado"

$cp
 [1]  66.518070  67.695892 108.469236 141.093441  20.522784  33.536154
 [7]  43.872905  57.174572  67.961243 101.936972   3.387945  11.434313
[13]  32.960084  58.357601   5.000000

Se observa que \(C_p = 3.387945< p=4\), para ese modelo con \(X1, X2~y~ X3\), la relación indica un sesgo uy bajo (o no sesgo).

Criterio \(AIC_p\)

El criterio Akaike’s Information Criterion \(AIC_p\), que se calcula como se muestra en la Ecuación 7, penaliza a los modelos con muchas variables regresoras (como el \(R^2_{ap}\) y \(C_p\)).

\[\begin{align} AIC_p = n~ln (SSE_p) - n~ln(n)+2p \end{align} \tag{7}\]

Note que el primer término \(n~ln(SSE_p)\) decrece cuando \(p\) crece, el segundo término \(n~ln(n)\) es fijo para un valor de \(n\), el tercer término \(2p\), aumenta con el número de parámetros \(p\).

En este sentido, los modelos con \(SSE_p\) bajos tienen buen desempeño en este criterio, siempre que la penalización \(2p\) no sea tan grande.

Se escogen los modelos con menor \(AIC_p\).

Ejemplo de cálculo de \(AIC_p\).

#Datos
library(readxl)
datos <- read_excel("data_cirugia.xlsx")
datos$genero <- as.factor(datos$genero)
datos$uso_alcohol_moderado <- as.factor(datos$uso_alcohol_moderado)
datos$uso_alcohol_exceso <- as.factor(datos$uso_alcohol_exceso)

#Modelo que solo tiene X4
modelo <- lm(datos$ln_tiempo_supervivencia~datos$test_higado)

# SSE modelo con X4
anova <- aov(modelo)
resumen <- summary(anova)
SSE <- resumen[[1]]$`Sum Sq`[2]

# AIC_p
n <- nrow(datos)
p<-length(coef(modelo))
AIC_p <- (n*log(SSE))-(n*log(n))+(2*p)
AIC_p
[1] -103.2679
#Con sentencias de R
library(olsrr)
resultados <- ols_aic(modelo, method="SAS", corrected = FALSE)
resultados
[1] -103.2679
# AIC con todos los posibles modelos
#Modelo completo con X1, X2, X3, X4, p=5 
modelo_completo <- 
lm(datos$ln_tiempo_supervivencia~datos$coagulacion_score+datos$indice_pronostico+datos$test_enzimas+datos$test_higado)

library(olsrr)
resultados_todos <- ols_step_all_possible(modelo_completo)
aic_todos <- c(resultados_todos$result[3],resultados_todos$result[9])
print(aic_todos)
$predictors
 [1] "datos$test_enzimas"                                                                  
 [2] "datos$test_higado"                                                                   
 [3] "datos$indice_pronostico"                                                             
 [4] "datos$coagulacion_score"                                                             
 [5] "datos$indice_pronostico datos$test_enzimas"                                          
 [6] "datos$test_enzimas datos$test_higado"                                                
 [7] "datos$coagulacion_score datos$test_enzimas"                                          
 [8] "datos$indice_pronostico datos$test_higado"                                           
 [9] "datos$coagulacion_score datos$test_higado"                                           
[10] "datos$coagulacion_score datos$indice_pronostico"                                     
[11] "datos$coagulacion_score datos$indice_pronostico datos$test_enzimas"                  
[12] "datos$indice_pronostico datos$test_enzimas datos$test_higado"                        
[13] "datos$coagulacion_score datos$test_enzimas datos$test_higado"                        
[14] "datos$coagulacion_score datos$indice_pronostico datos$test_higado"                   
[15] "datos$coagulacion_score datos$indice_pronostico datos$test_enzimas datos$test_higado"

$aic
 [1] 51.43434 51.97746 68.04010 78.14901 24.76682 34.15635 40.60177 47.90340
 [9] 53.17566 67.05145  9.08398 17.23450 34.42273 49.48230 10.65813

Criterio \(BIC_p\)

El criterio Bayesian Information Criterion \(BIC_p\), que se calcula como se muestra en la Ecuación 8, penaliza a los modelos con muchas variables regresoras (como el \(R^2_{ap}\) y \(C_p\)).

\[\begin{align} BIC_p = n~ln (SSE_p) - n~ln(n)+ ln(n)~p \end{align} \tag{8}\]

Note que el primer término \(n~ln(SSE_p)\) decrece cuando \(p\) crece, el segundo término \(n~ln(n)\) es fijo para un valor de \(n\), el tercer término \(ln(n)~p\), aumenta con el número de parámetros \(p\).

En este sentido, los modelos con \(SSE_p\) bajos tienen buen desempeño en este criterio, siempre que la penalización \(ln(n)~p\) no sea tan grande.

Se escogen los modelos con menor \(AIC_p\).

Ejemplo de cálculo de \(BIC_p\).

#Datos
library(readxl)
datos <- read_excel("data_cirugia.xlsx")
datos$genero <- as.factor(datos$genero)
datos$uso_alcohol_moderado <- as.factor(datos$uso_alcohol_moderado)
datos$uso_alcohol_exceso <- as.factor(datos$uso_alcohol_exceso)

#Modelo que solo tiene X4
modelo <- lm(datos$ln_tiempo_supervivencia~datos$test_higado)

# SSE modelo con X4
anova <- aov(modelo)
resumen <- summary(anova)
SSE <- resumen[[1]]$`Sum Sq`[2]

# BIC_p
n <- nrow(datos)
p<-length(coef(modelo))
BIC_p <- (n*log(SSE))-(n*log(n))+(log(n)*p)
BIC_p
[1] -99.28994
#Con sentencias de R
library(olsrr)
resultados <- ols_sbc(modelo, method="SAS")
resultados
[1] -99.28994
# BIC con todos los posibles modelos
#Modelo completo con X1, X2, X3, X4, p=5 
modelo_completo <- 
lm(datos$ln_tiempo_supervivencia~datos$coagulacion_score+datos$indice_pronostico+datos$test_enzimas+datos$test_higado)

library(olsrr)
resultados_todos <- ols_step_all_possible(modelo_completo)
bic_todos <- c(resultados_todos$result[3],resultados_todos$result[10])
print(bic_todos)
$predictors
 [1] "datos$test_enzimas"                                                                  
 [2] "datos$test_higado"                                                                   
 [3] "datos$indice_pronostico"                                                             
 [4] "datos$coagulacion_score"                                                             
 [5] "datos$indice_pronostico datos$test_enzimas"                                          
 [6] "datos$test_enzimas datos$test_higado"                                                
 [7] "datos$coagulacion_score datos$test_enzimas"                                          
 [8] "datos$indice_pronostico datos$test_higado"                                           
 [9] "datos$coagulacion_score datos$test_higado"                                           
[10] "datos$coagulacion_score datos$indice_pronostico"                                     
[11] "datos$coagulacion_score datos$indice_pronostico datos$test_enzimas"                  
[12] "datos$indice_pronostico datos$test_enzimas datos$test_higado"                        
[13] "datos$coagulacion_score datos$test_enzimas datos$test_higado"                        
[14] "datos$coagulacion_score datos$indice_pronostico datos$test_higado"                   
[15] "datos$coagulacion_score datos$indice_pronostico datos$test_enzimas datos$test_higado"

$sbic
 [1] -104.53301 -104.01844  -88.71141  -78.99538 -129.84003 -121.34342
 [7] -115.45685 -108.73487 -103.84667  -90.85182 -143.43175 -136.49638
[13] -121.55137 -108.08915 -141.58765

Selección de submodelos con olsrr

La librería olsrr```` enRpermite ver los mejores submodelos usando la sentenciaols_step_all_possible```:

#Datos
library(readxl)
datos <- read_excel("data_cirugia.xlsx")
datos$genero <- as.factor(datos$genero)
datos$uso_alcohol_moderado <- as.factor(datos$uso_alcohol_moderado)
datos$uso_alcohol_exceso <- as.factor(datos$uso_alcohol_exceso)

#Modelo completo (X1, X2, X3, X4)
modelo <- lm(datos$ln_tiempo_supervivencia~datos$coagulacion_score+datos$indice_pronostico+datos$test_enzimas+datos$test_higado)

#Mejores modelos
library (olsrr)
ols_step_best_subset(modelo)
                                      Best Subsets Regression                                      
---------------------------------------------------------------------------------------------------
Model Index    Predictors
---------------------------------------------------------------------------------------------------
     1         datos$test_enzimas                                                                   
     2         datos$indice_pronostico datos$test_enzimas                                           
     3         datos$coagulacion_score datos$indice_pronostico datos$test_enzimas                   
     4         datos$coagulacion_score datos$indice_pronostico datos$test_enzimas datos$test_higado 
---------------------------------------------------------------------------------------------------

                                                  Subsets Regression Summary                                                   
-------------------------------------------------------------------------------------------------------------------------------
                       Adj.        Pred                                                                                         
Model    R-Square    R-Square    R-Square     C(p)        AIC        SBIC         SBC       MSEP      FPE       HSP       APC  
-------------------------------------------------------------------------------------------------------------------------------
  1        0.4273      0.4162      0.3496    66.5181    51.4343    -104.5330    57.4013    7.6160    0.1463    0.0028    0.6168 
  2        0.6632      0.6500      0.6044    20.5228    24.7668    -129.8400    32.7228    4.5684    0.0893    0.0017    0.3765 
  3        0.7572      0.7427      0.6943     3.3879     9.0840    -143.4317    19.0289    3.3599    0.0668    0.0013    0.2816 
  4        0.7591      0.7395      0.6822     5.0000    10.6581    -141.5876    22.5920    3.4030    0.0688    0.0013    0.2900 
-------------------------------------------------------------------------------------------------------------------------------
AIC: Akaike Information Criteria 
 SBIC: Sawa's Bayesian Information Criteria 
 SBC: Schwarz Bayesian Criteria 
 MSEP: Estimated error of prediction, assuming multivariate normality 
 FPE: Final Prediction Error 
 HSP: Hocking's Sp 
 APC: Amemiya Prediction Criteria 

Métodos paso a paso (Stepwise) para selección de modelos.

Eliminación progresiva (Backwards Elimination = BE)

El método Stepwise funciona de la siguiente forma:

  1. Se empieza con las \(p-1\) variables regresoras.

  2. Se elimina la variable regresora menos explicativa. Usando el siguiente estadístico, (Ecuación 9):

\[\begin{align} F = \frac{\frac{SSE_0-SSE_1}{DFE_0-DFE_1}}{\frac{SSE_1}{DF_1}} \end{align} \tag{9}\]

Donde:

  • \(SSE_1\): suma de cuadrados del error del modelo ampliado.
  • \(SSE_0\): suma de cuadrados del error del modelo reducido.
  • \(DFE_1\): grados de libertad del error del modelo ampliado.
  • \(DFE_0\): suma de cuadrados del error del modelo reducido.
  1. Se ajusta el modelo con la con los \(p-2\) variables restantes.

  2. Se repite numeral 2 hasta que todas las variables del modelo tengan un \(F\) predeterminado (olsrr cuando todos los \(p-values>0.3\), se puede modificar con el argumento penter).

Eliminación progresiva en R con olsrr

#Datos
library(readxl)
datos <- read_excel("data_cirugia.xlsx")
datos$genero <- as.factor(datos$genero)
datos$uso_alcohol_moderado <- as.factor(datos$uso_alcohol_moderado)
datos$uso_alcohol_exceso <- as.factor(datos$uso_alcohol_exceso)

#Modelo completo
modelo <- lm(datos$ln_tiempo_supervivencia~datos$coagulacion_score+datos$indice_pronostico+datos$test_enzimas+datos$test_higado+datos$edad+datos$genero+datos$uso_alcohol_moderado+datos$uso_alcohol_exceso)

#Backward
library (olsrr)
ols_step_backward_p(modelo, details=TRUE) #details es para mostrar el paso a paso
Backward Elimination Method 
---------------------------

Candidate Terms: 

1. datos$coagulacion_score 
2. datos$indice_pronostico 
3. datos$test_enzimas 
4. datos$test_higado 
5. datos$edad 
6. datos$genero 
7. datos$uso_alcohol_moderado 
8. datos$uso_alcohol_exceso 


Step   => 0 
Model  => datos$ln_tiempo_supervivencia ~ datos$coagulacion_score + datos$indice_pronostico + datos$test_enzimas + datos$test_higado + datos$edad + datos$genero + datos$uso_alcohol_moderado + datos$uso_alcohol_exceso 
R2     => 0.846 

Initiating stepwise selection... 

Step     => 1 
Removed  => datos$test_higado 
Model    => datos$ln_tiempo_supervivencia ~ datos$coagulacion_score + datos$indice_pronostico + datos$test_enzimas + datos$edad + datos$genero + datos$uso_alcohol_moderado + datos$uso_alcohol_exceso 
R2       => 0.84601 

Step     => 2 
Removed  => datos$uso_alcohol_moderado 
Model    => datos$ln_tiempo_supervivencia ~ datos$coagulacion_score + datos$indice_pronostico + datos$test_enzimas + datos$edad + datos$genero + datos$uso_alcohol_exceso 
R2       => 0.84347 


No more variables to be removed.

Variables Removed: 

=> datos$test_higado 
=> datos$uso_alcohol_moderado 

                                     Stepwise Summary                                     
----------------------------------------------------------------------------------------
Step    Variable                       AIC       SBC        SBIC        R2       Adj. R2 
----------------------------------------------------------------------------------------
 0      Full Model                    -5.532    14.358    -155.257    0.84611    0.81875 
 1      datos$test_higado             -7.497    10.403    -157.634    0.84601    0.82258 
 2      datos$uso_alcohol_moderado    -8.613     7.299    -159.406    0.84347    0.82348 
----------------------------------------------------------------------------------------

Final Model Output 
------------------

                        Model Summary                          
--------------------------------------------------------------
R                       0.918       RMSE                0.193 
R-Squared               0.843       MSE                 0.043 
Adj. R-Squared          0.823       Coef. Var           3.211 
Pred R-Squared          0.784       AIC                -8.613 
MAE                     0.162       SBC                 7.299 
--------------------------------------------------------------
 RMSE: Root Mean Square Error 
 MSE: Mean Square Error 
 MAE: Mean Absolute Error 
 AIC: Akaike Information Criteria 
 SBC: Schwarz Bayesian Criteria 

                               ANOVA                                
-------------------------------------------------------------------
               Sum of                                              
              Squares        DF    Mean Square      F         Sig. 
-------------------------------------------------------------------
Regression     10.800         6          1.800    42.209    0.0000 
Residual        2.004        47          0.043                     
Total          12.805        53                                    
-------------------------------------------------------------------

                                         Parameter Estimates                                          
-----------------------------------------------------------------------------------------------------
                    model      Beta    Std. Error    Std. Beta      t        Sig      lower    upper 
-----------------------------------------------------------------------------------------------------
              (Intercept)     4.054         0.235                 17.272    0.000     3.582    4.527 
  datos$coagulacion_score     0.072         0.019        0.233     3.839    0.000     0.034    0.109 
  datos$indice_pronostico     0.014         0.002        0.473     8.051    0.000     0.010    0.017 
       datos$test_enzimas     0.015         0.001        0.653    10.909    0.000     0.012    0.018 
               datos$edad    -0.003         0.003       -0.078    -1.343    0.186    -0.009    0.002 
            datos$genero1     0.087         0.058        0.089     1.512    0.137    -0.029    0.203 
datos$uso_alcohol_exceso1     0.351         0.076        0.280     4.597    0.000     0.197    0.505 
-----------------------------------------------------------------------------------------------------

Introducción progresiva (Forwards Selection = FS)

El método Stepwise funciona de la siguiente forma:

  1. Se empieza con \(0\) variables regresoras.

  2. Se introduce la variable con mayor estadístico \(F\), (Ecuación 9). Esto equivale a introducir la variable con menor \(p-value\) para los contrastes individuales \(\beta_k=0\)

  3. Se repite numeral 2 hasta que el valor de \(F\) de todas las variables que no están incluidas en el modelo es menor que un nivel predeterminado. (olsrr cuando los \(p-values>0.3\), se puede modificar con el argumento penter)

Introducción progresiva en R con olsrr

#Datos
library(readxl)
datos <- read_excel("data_cirugia.xlsx")
datos$genero <- as.factor(datos$genero)
datos$uso_alcohol_moderado <- as.factor(datos$uso_alcohol_moderado)
datos$uso_alcohol_exceso <- as.factor(datos$uso_alcohol_exceso)

#Modelo completo
modelo <- lm(datos$ln_tiempo_supervivencia~datos$coagulacion_score+datos$indice_pronostico+datos$test_enzimas+datos$test_higado+datos$edad+datos$genero+datos$uso_alcohol_moderado+datos$uso_alcohol_exceso)

#Forward
library (olsrr)
ols_step_forward_p(modelo, details=TRUE) #details es para mostrar el paso a paso
Forward Selection Method 
------------------------

Candidate Terms: 

1. datos$coagulacion_score 
2. datos$indice_pronostico 
3. datos$test_enzimas 
4. datos$test_higado 
5. datos$edad 
6. datos$genero 
7. datos$uso_alcohol_moderado 
8. datos$uso_alcohol_exceso 


Step   => 0 
Model  => datos$ln_tiempo_supervivencia ~ 1 
R2     => 0 

Initiating stepwise selection... 

                            Selection Metrics Table                             
-------------------------------------------------------------------------------
Predictor                     Pr(>|t|)    R-Squared    Adj. R-Squared     AIC   
-------------------------------------------------------------------------------
datos$test_enzimas             0.00000        0.427             0.416    51.434 
datos$test_higado              0.00000        0.421             0.410    51.977 
datos$indice_pronostico        0.00033        0.221             0.206    68.040 
datos$uso_alcohol_exceso       0.00548        0.139             0.123    73.443 
datos$coagulacion_score        0.07256        0.061             0.043    78.149 
datos$genero                   0.09146        0.054             0.036    78.543 
datos$edad                     0.29533        0.021             0.002    80.381 
datos$uso_alcohol_moderado     0.35993        0.016            -0.003    80.651 
-------------------------------------------------------------------------------

Step      => 1 
Selected  => datos$test_enzimas 
Model     => datos$ln_tiempo_supervivencia ~ datos$test_enzimas 
R2        => 0.427 

                            Selection Metrics Table                             
-------------------------------------------------------------------------------
Predictor                     Pr(>|t|)    R-Squared    Adj. R-Squared     AIC   
-------------------------------------------------------------------------------
datos$indice_pronostico        0.00000        0.663             0.650    24.767 
datos$test_higado                2e-05        0.599             0.583    34.156 
datos$coagulacion_score        0.00053        0.548             0.531    40.602 
datos$uso_alcohol_exceso       0.00351        0.516             0.497    44.323 
datos$genero                   0.17845        0.447             0.426    51.499 
datos$edad                     0.19579        0.446             0.424    51.645 
datos$uso_alcohol_moderado     0.49972        0.432             0.410    52.947 
-------------------------------------------------------------------------------

Step      => 2 
Selected  => datos$indice_pronostico 
Model     => datos$ln_tiempo_supervivencia ~ datos$test_enzimas + datos$indice_pronostico 
R2        => 0.663 

                            Selection Metrics Table                             
-------------------------------------------------------------------------------
Predictor                     Pr(>|t|)    R-Squared    Adj. R-Squared     AIC   
-------------------------------------------------------------------------------
datos$uso_alcohol_exceso         1e-05        0.778             0.765     4.243 
datos$coagulacion_score          6e-05        0.757             0.743     9.084 
datos$test_higado              0.00311        0.718             0.701    17.234 
datos$uso_alcohol_moderado     0.10105        0.681             0.662    23.834 
datos$edad                     0.16489        0.676             0.657    24.663 
datos$genero                   0.32893        0.670             0.650    25.727 
-------------------------------------------------------------------------------

Step      => 3 
Selected  => datos$uso_alcohol_exceso 
Model     => datos$ln_tiempo_supervivencia ~ datos$test_enzimas + datos$indice_pronostico + datos$uso_alcohol_exceso 
R2        => 0.778 

                            Selection Metrics Table                             
-------------------------------------------------------------------------------
Predictor                     Pr(>|t|)    R-Squared    Adj. R-Squared     AIC   
-------------------------------------------------------------------------------
datos$coagulacion_score        0.00033        0.830             0.816    -8.131 
datos$test_higado              0.00321        0.814             0.799    -3.424 
datos$genero                   0.12137        0.789             0.772     3.572 
datos$edad                     0.26828        0.784             0.766     4.879 
datos$uso_alcohol_moderado     0.52047        0.780             0.762     5.783 
-------------------------------------------------------------------------------

Step      => 4 
Selected  => datos$coagulacion_score 
Model     => datos$ln_tiempo_supervivencia ~ datos$test_enzimas + datos$indice_pronostico + datos$uso_alcohol_exceso + datos$coagulacion_score 
R2        => 0.83 

                            Selection Metrics Table                             
-------------------------------------------------------------------------------
Predictor                     Pr(>|t|)    R-Squared    Adj. R-Squared     AIC   
-------------------------------------------------------------------------------
datos$genero                   0.14210        0.837             0.821    -8.580 
datos$edad                     0.19402        0.836             0.819    -8.048 
datos$test_higado              0.33906        0.833             0.816    -7.170 
datos$uso_alcohol_moderado     0.48326        0.832             0.814    -6.689 
-------------------------------------------------------------------------------

Step      => 5 
Selected  => datos$genero 
Model     => datos$ln_tiempo_supervivencia ~ datos$test_enzimas + datos$indice_pronostico + datos$uso_alcohol_exceso + datos$coagulacion_score + datos$genero 
R2        => 0.837 

                            Selection Metrics Table                             
-------------------------------------------------------------------------------
Predictor                     Pr(>|t|)    R-Squared    Adj. R-Squared     AIC   
-------------------------------------------------------------------------------
datos$edad                     0.18582        0.843             0.823    -8.613 
datos$uso_alcohol_moderado     0.48340        0.839             0.819    -7.151 
datos$test_higado              0.54548        0.839             0.818    -7.005 
-------------------------------------------------------------------------------

Step      => 6 
Selected  => datos$edad 
Model     => datos$ln_tiempo_supervivencia ~ datos$test_enzimas + datos$indice_pronostico + datos$uso_alcohol_exceso + datos$coagulacion_score + datos$genero + datos$edad 
R2        => 0.843 

                            Selection Metrics Table                             
-------------------------------------------------------------------------------
Predictor                     Pr(>|t|)    R-Squared    Adj. R-Squared     AIC   
-------------------------------------------------------------------------------
datos$uso_alcohol_moderado     0.38796        0.846             0.823    -7.497 
datos$test_higado              0.82164        0.844             0.820    -6.673 
-------------------------------------------------------------------------------


No more variables to be added.

Variables Selected: 

=> datos$test_enzimas 
=> datos$indice_pronostico 
=> datos$uso_alcohol_exceso 
=> datos$coagulacion_score 
=> datos$genero 
=> datos$edad 

                                    Stepwise Summary                                    
--------------------------------------------------------------------------------------
Step    Variable                     AIC       SBC        SBIC        R2       Adj. R2 
--------------------------------------------------------------------------------------
 0      Base Model                  79.529    83.507     -76.676    0.00000    0.00000 
 1      datos$test_enzimas          51.434    57.401    -105.440    0.42725    0.41624 
 2      datos$indice_pronostico     24.767    32.723    -131.597    0.66318    0.64997 
 3      datos$uso_alcohol_exceso     4.243    14.188    -150.402    0.77805    0.76473 
 4      datos$coagulacion_score     -8.131     3.803    -160.533    0.82992    0.81603 
 5      datos$genero                -8.580     5.343    -160.229    0.83746    0.82053 
 6      datos$edad                  -8.613     7.299    -159.406    0.84347    0.82348 
--------------------------------------------------------------------------------------

Final Model Output 
------------------

                        Model Summary                          
--------------------------------------------------------------
R                       0.918       RMSE                0.193 
R-Squared               0.843       MSE                 0.043 
Adj. R-Squared          0.823       Coef. Var           3.211 
Pred R-Squared          0.784       AIC                -8.613 
MAE                     0.162       SBC                 7.299 
--------------------------------------------------------------
 RMSE: Root Mean Square Error 
 MSE: Mean Square Error 
 MAE: Mean Absolute Error 
 AIC: Akaike Information Criteria 
 SBC: Schwarz Bayesian Criteria 

                               ANOVA                                
-------------------------------------------------------------------
               Sum of                                              
              Squares        DF    Mean Square      F         Sig. 
-------------------------------------------------------------------
Regression     10.800         6          1.800    42.209    0.0000 
Residual        2.004        47          0.043                     
Total          12.805        53                                    
-------------------------------------------------------------------

                                         Parameter Estimates                                          
-----------------------------------------------------------------------------------------------------
                    model      Beta    Std. Error    Std. Beta      t        Sig      lower    upper 
-----------------------------------------------------------------------------------------------------
              (Intercept)     4.054         0.235                 17.272    0.000     3.582    4.527 
       datos$test_enzimas     0.015         0.001        0.653    10.909    0.000     0.012    0.018 
  datos$indice_pronostico     0.014         0.002        0.473     8.051    0.000     0.010    0.017 
datos$uso_alcohol_exceso1     0.351         0.076        0.280     4.597    0.000     0.197    0.505 
  datos$coagulacion_score     0.072         0.019        0.233     3.839    0.000     0.034    0.109 
            datos$genero1     0.087         0.058        0.089     1.512    0.137    -0.029    0.203 
               datos$edad    -0.003         0.003       -0.078    -1.343    0.186    -0.009    0.002 
-----------------------------------------------------------------------------------------------------

Método exhaustivo o análisis de los mejores subconjuntos (Exhaustive or All-Possible-Subsets Method = APS)

Consiste en examinar todos los posibles subconjuntos de regresores con un cardinal \(r≤k\) predeterminado. Esto significa que hay que examinar \(2^{r−1}\) subconjuntos de regresores (ignoramos el conjunto vacío).

Los posibles submodelos se pueden comparar entre sí mediante un criterio de selección de modelos COMO \(C_p, AIC~o~BIC\)

Método exhaustivo en R con leaps

#Datos
library(readxl)
datos <- read_excel("data_cirugia.xlsx")
datos$genero <- as.factor(datos$genero)
datos$uso_alcohol_moderado <- as.factor(datos$uso_alcohol_moderado)
datos$uso_alcohol_exceso <- as.factor(datos$uso_alcohol_exceso)

#Exhaustivo
library(leaps)
exhaustivo<- regsubsets(datos$ln_tiempo_supervivencia~., data = datos, nvmax = 3,  force.in = NULL, force.out = NULL, method = "exhaustive")  #nbest = 1, un único modelo óptimo para cada número de predictores. nvmax = NULL para que no haya límite en el número de regresorea. # force.in: regresores que deberían estar en todos los modelos. force.out: variables que no deberían estar en ningún modelo
summary(exhaustivo)
Subset selection object
Call: regsubsets.formula(datos$ln_tiempo_supervivencia ~ ., data = datos, 
    nvmax = 3, force.in = NULL, force.out = NULL, method = "exhaustive")
8 Variables  (and intercept)
                      Forced in Forced out
coagulacion_score         FALSE      FALSE
indice_pronostico         FALSE      FALSE
test_enzimas              FALSE      FALSE
test_higado               FALSE      FALSE
edad                      FALSE      FALSE
genero1                   FALSE      FALSE
uso_alcohol_moderado1     FALSE      FALSE
uso_alcohol_exceso1       FALSE      FALSE
1 subsets of each size up to 3
Selection Algorithm: exhaustive
         coagulacion_score indice_pronostico test_enzimas test_higado edad
1  ( 1 ) " "               " "               "*"          " "         " " 
2  ( 1 ) " "               "*"               "*"          " "         " " 
3  ( 1 ) " "               "*"               "*"          " "         " " 
         genero1 uso_alcohol_moderado1 uso_alcohol_exceso1
1  ( 1 ) " "     " "                   " "                
2  ( 1 ) " "     " "                   " "                
3  ( 1 ) " "     " "                   "*"