Nestfs proporciona una implementación de la selección directa basada en la regresión lineal y logística que adopta la validación cruzada como un componente central del procedimiento de selección.
La selección de avance es un enfoque inherentemente lento, ya que para cada variable se debe ajustar un modelo. En nuestra implementación, este problema se agrava aún más por el hecho de que una validación cruzada interna ocurre en cada iteración, con el objetivo de guiar la selección hacia variables que tienen mejores propiedades de generalización.
El código está paralelo a los pliegues internos, gracias al paquete paralelo . Por lo tanto, el tiempo del usuario depende de la cantidad de núcleos disponibles, pero no hay ventaja en el uso de más núcleos que los pliegues internos. El número de núcleos asignados a los cálculos debe registrarse antes de comenzar configurando la opción "Mc.cores".
La principal ventaja de la selección hacia adelante es que proporciona un modelo de inmediato interpretable, y el panel de variables obtenidas es, en cierto sentido, la menos redundante, particularmente si el número de variables para elegir no es demasiado grande (en nuestra experiencia, hasta alrededor de 30-40 variables).
Sin embargo, cuando el número de variables es mucho mayor que eso, la selección hacia adelante, además de ser insoportablemente lenta, puede estar más sujeto a un sobreajuste, lo cual está en la naturaleza de su diseño codicioso.
Un paquete precompilado está disponible en CRAN.
Primero cargue el paquete y registre el número de núcleos que se utilizarán configurando la opción mc.cores
. Si tiene la suerte de trabajar en una gran máquina multinúcleo, el mejor rendimiento se logra registrando tantos núcleos como el número de pliegues internos que se utilizan (el valor predeterminado es 30).
library( nestfs )
options( mc.cores = 10 )
Para ejecutar la selección de un modelo de línea de base que contiene solo edad y sexo, lo siguiente es suficiente:
data( diabetes )
fs.res <- fs( Y ~ age + sex , diabetes , family = gaussian())
summary( fs.res )
# # vars fdr llks diffs iter
# # 1 age NA NA NA NA
# # 2 sex NA -2136.854 NA NA
# # 3 ltg 7.008928e-10 -2058.831 78.022766 1
# # 4 bmi 1.850715e-05 -2009.568 49.263387 2
# # 5 map 2.020038e-03 -1999.253 10.314799 3
# # 6 age.sex 1.508210e-02 -1992.544 6.709064 4
# # 7 hdl 4.039276e-02 -1985.208 7.336623 5
# # 8 bmi.map 7.474167e-02 -1980.913 4.294736 6
De manera predeterminada, la selección ocurre sobre todas las variables presentes en Data.Frame que no forman parte del modelo inicial. Esto se puede controlar a través de la opción choose.from
, que acepta nombres o índices de variables.
Es posible promover la selección más escasa solicitando una mejora mayor en la probabilidad log (opción min.llk.diff
): Esto se recomienda, especialmente cuando el número de variables para elegir excede 10-15, ya que es nuestra experiencia que es la experiencia predeterminada La configuración de 2 (ya más estricta que la adoptada por otros paquetes) puede conducir a un sobreajuste. En cualquier caso, es posible establecer un tamaño máximo del panel seleccionado reduciendo el número de iteraciones (opción max.iters
, de forma predeterminada establecida en 10).
La selección de avance anidada es útil para evaluar la estabilidad del proceso de selección realizándola en cada división de capacitación de los pliegues de validación cruzada:
folds <- create.folds( 10 , nrow( diabetes ), seed = 1 )
nest.res <- nested.fs( Y ~ age + sex , diabetes , family = gaussian(), folds = folds )
summary( nest.res )
# # vars percent coef coefIQR rank rankIQR diffLogLik diffLogLikIQR
# # 1 bmi 100 24.547 (23.61, 25.48) 2 (1.00, 2.00) 61.021 (44.49, 76.85)
# # 2 ltg 100 23.729 (22.39, 24.41) 2 (1.00, 2.00) 52.868 (36.09, 69.36)
# # 3 map 100 15.147 (14.45, 15.88) 3 (3.00, 3.75) 8.366 (8.04, 9.61)
# # 4 hdl 100 -13.297 (-13.65, -12.55) 4 (4.00, 4.00) 6.728 (6.35, 7.83)
# # 5 age.sex 80 8.825 (8.72, 9.24) 5 (5.00, 6.00) 4.625 (4.45, 5.37)
# # 6 bmi.map 70 8.165 (7.55, 8.27) 6 (5.50, 7.00) 3.604 (2.66, 4.15)
# # 7 bmi.glu 20 4.460 (4.07, 4.85) 5 (5.00, 5.00) 3.535 (3.09, 3.98)
# # 8 glu.2 20 6.477 (6.47, 6.49) 6 (6.25, 6.75) 2.984 (2.56, 3.41)
# # 9 sex.map 20 6.862 (6.71, 7.01) 6 (5.25, 5.75) 2.936 (2.89, 2.98)
# # 10 age.glu 10 7.469 (7.47, 7.47) 3 (3.00, 3.00) 4.826 (4.83, 4.83)
# # 11 age.map 10 7.365 (7.36, 7.36) 6 (6.00, 6.00) 2.679 (2.68, 2.68)
# # 12 bmi.2 10 7.987 (7.99, 7.99) 6 (6.00, 6.00) 2.466 (2.47, 2.47)
La salida anterior muestra que bmi
, ltg
, map
y hdl
se eligen en todos los pliegues, y la mayor parte de la mejora en el ajuste es proporcionada por las dos primeras variables, que concuerdan con lo que se encontró al ejecutar la selección de todos los datos.
Lo más importante es que la selección hacia adelante anidada produce una medida de rendimiento validada cruzada del proceso de selección, que es una estimación imparcial del rendimiento predictivo de los paneles seleccionados en los datos retirados:
nested.performance( nest.res )
# # Correlation coefficient: 0.7097
Esto se puede comparar con lo que obtiene el modelo de referencia en el mismo conjunto de pliegues de validación cruzada:
base.res <- nested.glm( Y ~ age + sex , diabetes , family = gaussian(), folds = folds )
nested.performance( base.res )
# # Correlation coefficient: 0.1551
M. Colombo, HC Looker, B. Farran et al., La molécula de lesión renal sérica 1 y la microglobulina beta-2 funcionan tan así como los paneles más grandes para la predicción de una disminución rápida en la función renal en la diabetes tipo 2, Diabetologia (2019) 62 ( 1): 156-168. https://doi.org/10.1007/s00125-018-4741-9
HC Looker, M. Colombo, S. Hess et al., Biomarcadores de progresión rápida de la enfermedad renal crónica en diabetes tipo 2, Kidney International (2015), 88 (4): 888-896. https://doi.org/10.1038/ki.2015.199
HC Looker, M. Colombo, F. Agakov et al., Biomarcadores de proteínas para la predicción de la enfermedad cardiovascular en la diabetes tipo 2, Diabetologia (2015) 58 (6): 1363-1371. https://doi.org/10.1007/s00125-015-3535-6