Saltar al contenido principal
LibreTexts Español

15.10: Selección de modelos

  • Page ID
    151885
  • \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \) \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)\(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\) \(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\)\(\newcommand{\AA}{\unicode[.8,0]{x212B}}\)

    Un problema bastante importante que queda es el problema de la “selección de modelos”. Es decir, si tenemos un conjunto de datos que contiene varias variables, ¿cuáles debemos incluir como predictores y cuáles no debemos incluir? En otras palabras, tenemos un problema de selección de variables. En general, la selección de modelos es un negocio complejo, pero se hace algo más simple si nos limitamos al problema de elegir un subconjunto de las variables que deberían incluirse en el modelo. Sin embargo, no voy a tratar de cubrir ni siquiera este tema reducido con mucho detalle. En cambio, hablaré sobre dos principios amplios en los que debes pensar; y luego discutiré una herramienta concreta que R proporciona para ayudarte a seleccionar un subconjunto de variables para incluir en tu modelo. En primer lugar, los dos principios:

    • Es agradable tener una base sustantiva real para sus elecciones. Es decir, en muchas situaciones tú el investigador tienes buenas razones para escoger un número pequeño de posibles modelos de regresión que son de interés teórico; estos modelos tendrán una interpretación sensata en el contexto de tu campo. Nunca descuentes la importancia de esto. La estadística sirve al proceso científico, no al revés.
    • En la medida en que sus elecciones se basan en la inferencia estadística, existe un intercambio entre la simplicidad y la bondad de ajuste. A medida que agrega más predictores al modelo, lo hace más complejo; cada predictor agrega un nuevo parámetro libre (es decir, un nuevo coeficiente de regresión), y cada nuevo parámetro aumenta la capacidad del modelo para “absorber” variaciones aleatorias. Entonces, la bondad del ajuste (por ejemplo, R 2) sigue aumentando a medida que agrega más predictores pase lo que pase. Si quieres que tu modelo sea capaz de generalizar bien a nuevas observaciones, debes evitar arrojar demasiadas variables.

    Este último principio a menudo se conoce como la navaja de Ockham, y a menudo se resume en términos del siguiente dicho conciso: no multipliques entidades más allá de la necesidad. En este contexto, significa: no arrojes un montón de predictores en gran parte irrelevantes solo para impulsar tu R2. Hm. Sí, el original estuvo mejor.

    En cualquier caso, lo que necesitamos es un criterio matemático real que implemente el principio cualitativo detrás de la navaja de Ockham en el contexto de seleccionar un modelo de regresión. Al resultar que hay varias posibilidades. El del que voy a hablar es el criterio de información Akaike (AIC; Akaike 1974) simplemente porque es el predeterminado que se usa en la función R step (). En el contexto de un modelo de regresión lineal (¡e ignorando términos que no dependen del modelo de ninguna manera!) , el AIC para un modelo que tiene K variables predictoras más una intercepción es: 227

    \(\mathrm{AIC}=\dfrac{\mathrm{SS}_{r e s}^{2}}{\hat{\sigma}}+2 K\)

    Cuanto menor sea el valor de AIC, mejor será el rendimiento del modelo. Si ignoramos los detalles de bajo nivel, es bastante obvio lo que hace el AIC: a la izquierda tenemos un término que aumenta a medida que las predicciones del modelo empeoran; a la derecha tenemos un término que aumenta a medida que aumenta la complejidad del modelo. El mejor modelo es el que se ajusta bien a los datos (residuos bajos; lado izquierdo) usando el menor número posible de predictores (K bajo; lado derecho). En resumen, esta es una implementación simple de la maquinilla de afeitar de Ockham.

    Eliminación hacia atrás

    Bien, echemos un vistazo a la función step () en el trabajo. En este ejemplo lo mantendré simple y utilizaré solo el enfoque básico de eliminación hacia atrás. Es decir, comenzar con el modelo de regresión completo, incluyendo todos los predictores posibles. Entonces, en cada “paso” intentamos todas las formas posibles de eliminar una de las variables, y se acepta cualquiera de estas que sea mejor (en términos del valor AIC más bajo). Esto se convierte en nuestro nuevo modelo de regresión; y luego intentamos todas las eliminaciones posibles del nuevo modelo, nuevamente eligiendo la opción con AIC más bajo. Este proceso continúa hasta que terminamos con un modelo que tiene un valor AIC menor que cualquiera de los otros modelos posibles que podrías producir eliminando uno de sus predictores. Veamos esto en acción. Primero, necesito definir el modelo a partir del cual se inicia el proceso.

    full.model <- lm( formula = dan.grump ~ dan.sleep + baby.sleep + day,  
                       data = parenthood  
     )

    Eso no es nada terriblemente nuevo: otra regresión más. Boooring. Aún así, necesitamos hacerlo: el argumento objeto a la función step () será este modelo de regresión. Con esto en mente, llamaría a la función step () usando el siguiente comando:

     step( object = full.model,     # start at the full model
           direction = "backward"   # allow it remove predictors but not add them
     )
    
    ## Start:  AIC=299.08
    ## dan.grump ~ dan.sleep + baby.sleep + day
    ## 
    ##              Df Sum of Sq    RSS    AIC
    ## - baby.sleep  1       0.1 1837.2 297.08
    ## - day         1       1.6 1838.7 297.16
    ## <none>                    1837.1 299.08
    ## - dan.sleep   1    4909.0 6746.1 427.15
    ## 
    ## Step:  AIC=297.08
    ## dan.grump ~ dan.sleep + day
    ## 
    ##             Df Sum of Sq    RSS    AIC
    ## - day        1       1.6 1838.7 295.17
    ## <none>                   1837.2 297.08
    ## - dan.sleep  1    8103.0 9940.1 463.92
    ## 
    ## Step:  AIC=295.17
    ## dan.grump ~ dan.sleep
    ## 
    ##             Df Sum of Sq    RSS    AIC
    ## <none>                   1838.7 295.17
    ## - dan.sleep  1    8159.9 9998.6 462.50
    ## 
    ## Call:
    ## lm(formula = dan.grump ~ dan.sleep, data = parenthood)
    ## 
    ## Coefficients:
    ## (Intercept)    dan.sleep  
    ##     125.956       -8.937

    aunque en la práctica no necesitaba especificar dirección porque “hacia atrás” es el valor por defecto. La salida es algo larga, así que voy a pasar por ella lentamente. En primer lugar, la salida reporta el valor AIC para el mejor modelo actual:

    Start:  AIC=299.08
    dan.grump ~ dan.sleep + baby.sleep + day

    Ese es nuestro punto de partida. Dado que los valores pequeños de AIC son buenos, queremos ver si podemos obtener un valor menor que 299.08 eliminando uno de esos tres predictores. Entonces, lo que hace R es probar las tres posibilidades, calcular los valores AIC para cada una, y luego imprimir una tabla corta con los resultados:

                 Df Sum of Sq    RSS    AIC
    - baby.sleep  1       0.1 1837.2 297.08
    - day         1       1.6 1838.7 297.16
    <none>                    1837.1 299.08
    - dan.sleep   1    4909.0 6746.1 427.15

    Para leer esta tabla, ayuda señalar que el texto en la columna de la izquierda te está diciendo qué cambio hizo R al modelo de regresión. Entonces la línea que lee <none>es el modelo real con el que empezamos, y se puede ver en el lado derecho que esto todavía corresponde a un valor AIC de 299.08 (obviamente). Las otras tres filas de la tabla corresponden a los otros tres modelos que miró: intentó eliminar la variable baby.sleep, que se indica por - baby.sleep, y esto produjo un valor AIC de 297.08. Ese fue el mejor de los tres movimientos, así que está en la parte superior de la tabla. Entonces, esta movida es aceptada, y ahora empezamos de nuevo. Quedan dos predictores en el modelo, dan.sleep y day, por lo que intenta eliminarlos:

    Step:  AIC=297.08
    dan.grump ~ dan.sleep + day
    
                Df Sum of Sq    RSS    AIC
    - day        1       1.6 1838.7 295.17
    <none>                   1837.2 297.08
    - dan.sleep  1    8103.0 9940.1 463.92

    Bien, entonces lo que podemos ver es que al eliminar la variable day se baja el valor AIC de 297.08 a 295.17. Entonces R decide mantener ese cambio también, y sigue adelante:

    Step:  AIC=295.17
    dan.grump ~ dan.sleep
    
                Df Sum of Sq    RSS    AIC
    <none>                   1838.7 295.17
    - dan.sleep  1    8159.9 9998.6 462.50

    Esta vez, no hay más eliminaciones que realmente puedan mejorar el valor de AIC. Entonces la función step () se detiene e imprime el resultado del mejor modelo de regresión que podría encontrar:

    Call:
    lm(formula = dan.grump ~ dan.sleep, data = parenthood)
    
    Coefficients:
    (Intercept)    dan.sleep  
        125.956       -8.937  

    que es (quizás no tan sorprendentemente) el modelo de regressión.1 con el que empezamos al inicio del capítulo.

    Selección hacia delante

    Como alternativa, también puedes probar la selección hacia adelante. Esta vez comenzamos con el modelo más pequeño posible como nuestro punto de partida, y solo consideramos las posibles adiciones al modelo. Sin embargo, hay una complicación: también necesitas decirle a step () cuál es el modelo más grande posible que estés dispuesto a entretener, usando el argumento scope. El uso más simple es así:

     null.model <- lm( dan.grump ~ 1, parenthood )   # intercept only.
     step( object = null.model,     # start with null.model
           direction = "forward",   # only consider "addition" moves
           scope =  dan.grump ~ dan.sleep + baby.sleep + day  # largest model allowed
     )
    ## Start:  AIC=462.5
    ## dan.grump ~ 1
    ## 
    ##              Df Sum of Sq    RSS    AIC
    ## + dan.sleep   1    8159.9 1838.7 295.17
    ## + baby.sleep  1    3202.7 6795.9 425.89
    ## <none>                    9998.6 462.50
    ## + day         1      58.5 9940.1 463.92
    ## 
    ## Step:  AIC=295.17
    ## dan.grump ~ dan.sleep
    ## 
    ##              Df Sum of Sq    RSS    AIC
    ## <none>                    1838.7 295.17
    ## + day         1   1.55760 1837.2 297.08
    ## + baby.sleep  1   0.02858 1838.7 297.16
    
    ## 
    ## Call:
    ## lm(formula = dan.grump ~ dan.sleep, data = parenthood)
    ## 
    ## Coefficients:
    ## (Intercept)    dan.sleep  
    ##     125.956       -8.937

    Si hago esto, la salida toma una forma similar, pero ahora solo considera movimientos de suma (+) en lugar de movimientos de eliminación (-):

    Start:  AIC=462.5
    dan.grump ~ 1
    
                 Df Sum of Sq    RSS    AIC
    + dan.sleep   1    8159.9 1838.7 295.17
    + baby.sleep  1    3202.7 6795.9 425.89
    <none>                    9998.6 462.50
    + day         1      58.5 9940.1 463.92
    
    Step:  AIC=295.17
    dan.grump ~ dan.sleep
    
                 Df Sum of Sq    RSS    AIC
    <none>                    1838.7 295.17
    + day         1   1.55760 1837.2 297.08
    + baby.sleep  1   0.02858 1838.7 297.16
    
    Call:
    lm(formula = dan.grump ~ dan.sleep, data = parenthood)
    
    Coefficients:
    (Intercept)    dan.sleep  
        125.956       -8.937  

    Como puedes ver, se encuentra el mismo modelo. Sin embargo, en general, la selección hacia adelante y hacia atrás no siempre tiene que terminar en el mismo lugar.

    advertencia

    Los métodos automatizados de selección de variables son cosas seductoras, especialmente cuando están agrupados en funciones (bastante) simples como step (). Proporcionan un elemento de objetividad a tu selección de modelos, y eso es algo agradable. Desafortunadamente, a veces se usan como excusa para la falta de consideración. Ya no hay que pensar detenidamente qué predictores agregar al modelo y cuáles podrían ser las bases teóricas para su inclusión... todo se resuelve con la magia de la AIC. Y si empezamos a tirar frases como la navaja de Ockham, bueno, parece que todo está envuelto en un pequeño paquete bonito y ordenado con el que nadie puede discutir.

    O, quizás no. En primer lugar, hay muy poco acuerdo sobre lo que cuenta como un criterio apropiado de selección de modelos. Cuando me enseñaron la eliminación hacia atrás como licenciatura, usamos pruebas F para hacerlo, porque ese era el método predeterminado que usaba el software. El valor por defecto en la función step () es AIC, y como este es un texto introductorio ese es el único método que he descrito, pero el AIC no es apenas la Palabra de los Dioses de la Estadística. Es una aproximación, derivada bajo ciertos supuestos, y se garantiza que funcione solo para muestras grandes cuando se cumplan esos supuestos. Altera esas suposiciones y obtienes un criterio diferente, como el BIC por ejemplo. Vuelve a tomar un enfoque diferente y obtienes el criterio NML. Decide que eres bayesiano y obtienes una selección de modelos basada en odds ratios posteriores. Después hay un montón de herramientas específicas de regresión que no he mencionado. Y así sucesivamente. Todos estos diferentes métodos tienen fortalezas y debilidades, y algunos son más fáciles de calcular que otros (AIC es probablemente el más fácil del lote, lo que podría explicar su popularidad). Casi todos producen las mismas respuestas cuando la respuesta es “obvia” pero hay una buena cantidad de desacuerdo cuando el problema de selección de modelos se vuelve difícil.

    ¿Qué significa esto en la práctica? Bueno, podrías ir y pasar varios años enseñándote la teoría de la selección de modelos, aprendiendo todos los entresijos de la misma; para que finalmente puedas decidir qué piensas personalmente que es lo correcto. Hablando como alguien que realmente lo hizo, no lo recomendaría: probablemente saldrás del otro lado aún más confuso que cuando empezaste. Una mejor estrategia es mostrar un poco de sentido común... si estás mirando los resultados de un procedimiento step (), y el modelo que tiene sentido está cerca de tener el AIC más pequeño, pero es derrotado por poco por un modelo que no tiene ningún sentido... confía en tus instintos. La selección de modelos estadísticos es una herramienta inexacta, y como dije al principio, la interpretabilidad importa.

    Comparación de dos modelos de regresión

    Una alternativa al uso de procedimientos automatizados de selección de modelos es que el investigador seleccione explícitamente dos o más modelos de regresión para compararlos entre sí. Puedes hacer esto de varias maneras diferentes, dependiendo de la pregunta de investigación que intentes responder. Supongamos que queremos saber si la cantidad de sueño que consiguió mi hijo tiene o no alguna relación con mi malhumorado, más allá de lo que podríamos esperar de la cantidad de sueño que conseguí. También queremos asegurarnos de que el día en que tomamos la medida no influya en la relación. Es decir, nos interesa la relación entre baby.sleep y dan.grump, y desde esa perspectiva dan.sleep y día son variables molestas o covariables que queremos controlar para. En esta situación, lo que nos gustaría saber es si dan.grump ~ dan.sleep + day + baby.sleep (que llamaré Modelo 1, o M1) es un mejor modelo de regresión para estos datos que dan.grump ~ dan.sleep + day (que llamaré Modelo 0, o M0). Hay dos formas diferentes de comparar estos dos modelos, una basada en un criterio de selección de modelos como AIC, y la otra basada en una prueba de hipótesis explícita. Te mostraré primero el enfoque basado en AIC porque es más simple, y sigue naturalmente de la función step () que vimos en la última sección. Lo primero que tengo que hacer es ejecutar las regresiones:

    M0 <- lm( dan.grump ~ dan.sleep + day, parenthood )
    M1 <- lm( dan.grump ~ dan.sleep + day + baby.sleep, parenthood )

    Ahora que tengo mis modelos de regresión, podría usar la función summary () para ejecutar varias pruebas de hipótesis y otras estadísticas útiles, tal como hemos comentado a lo largo de este capítulo. Sin embargo, dado que el enfoque actual en la comparación de modelos, me saltaré este paso e iré directo a los cálculos de AIC. Convenientemente, la función AIC () en R le permite ingresar varios modelos de regresión, y escupirá los valores AIC para cada uno de ellos: 228

    AIC( M0, M1 )
    
    ##    df      AIC
    ## M0  4 582.8681
    ## M1  5 584.8646

    Dado que el Modelo 0 tiene el valor AIC más pequeño, se considera que es el mejor modelo para estos datos.

    Un enfoque algo diferente del problema surge del marco de prueba de hipótesis. Supongamos que tiene dos modelos de regresión, donde uno de ellos (Modelo 0) contiene un subconjunto de los predictores del otro (Modelo 1). Es decir, el Modelo 1 contiene todos los predictores incluidos en el Modelo 0, más uno o más predictores adicionales. Cuando esto sucede decimos que el Modelo 0 está anidado dentro del Modelo 1, o posiblemente que el Modelo 0 es un submodelo del Modelo 1. Independientemente de la terminología lo que esto significa es que podemos pensar en el Modelo 0 como una hipótesis nula y en el Modelo 1 como una hipótesis alternativa. Y de hecho podemos construir una prueba F para esto de una manera bastante sencilla. Podemos ajustar ambos modelos a los datos y obtener una suma residual de cuadrados para ambos modelos. Voy a denotar estos como\(\ SS_{res}^{(0)}\) y\(\ SS_{res}^{(1)}\) respectivamente. El superíndice aquí solo indica de qué modelo estamos hablando. Entonces nuestra estadística F es

    \(F=\dfrac{\left(\mathrm{SS}_{r e s}^{(0)}-\mathrm{SS}_{r e s}^{(1)}\right) / k}{\left(\mathrm{SS}_{r e s}^{(1)}\right) /(N-p-1)}\)

    donde N es el número de observaciones, p es el número de predictores en el modelo completo (sin incluir la intercepción), y k es la diferencia en el número de parámetros entre los dos modelos. 229 Los grados de libertad aquí son k y N−p−1. Tenga en cuenta que a menudo es más conveniente pensar en la diferencia entre esos dos valores SS como una suma de cuadrados por derecho propio. Es decir:

    \(\mathrm{SS}_{\Delta}=\mathrm{SS}_{r e s}^{(0)}-\mathrm{SS}_{r e s}^{(1)}\)

    La razón por la que esto es útil es que podemos expresar SSΔ una medida del grado en que los dos modelos hacen diferentes predicciones sobre la variable de resultado. Específicamente:

    \(\ SS_ {\Delta} = \sum_i (\hat{y_i}^{(1)} - \hat{y_i}^{(0)})^2\)

    donde\(\ \hat{y_i}^{(0)}\) es el valor ajustado para y i según el modelo M0 y\(\ \hat{y_i}^{(1)}\) es el valor ajustado para yi según el modelo M 1.

    Bien, entonces esa es la prueba de hipótesis que usamos para comparar dos modelos de regresión entre sí. Ahora bien, ¿cómo lo hacemos en R? La respuesta es usar la función anova (). Todo lo que tenemos que hacer es introducir los dos modelos que queremos comparar (modelo nulo primero):

    anova( M0, M1 )
    ## Analysis of Variance Table
    ## 
    ## Model 1: dan.grump ~ dan.sleep + day
    ## Model 2: dan.grump ~ dan.sleep + day + baby.sleep
    ##   Res.Df    RSS Df Sum of Sq      F Pr(>F)
    ## 1     97 1837.2                           
    ## 2     96 1837.1  1  0.063688 0.0033 0.9541

    Tenga en cuenta que, al igual que vimos con la salida de la función step (), R ha utilizado el acrónimo RSS para referirse a la suma residual de cuadrados de cada modelo. Es decir, RSS en esta salida corresponde a SS res en la fórmula anterior. Como tenemos p>.05 conservamos la hipótesis nula (M0). Este enfoque de regresión, en el que agregamos todas nuestras covariables en un modelo nulo, y luego agregamos las variables de interés a un modelo alternativo, y luego comparamos los dos modelos en el marco de prueba de hipótesis, a menudo se conoce como jerárquico regresión.


    This page titled 15.10: Selección de modelos is shared under a CC BY-SA 4.0 license and was authored, remixed, and/or curated by Danielle Navarro via source content that was edited to the style and standards of the LibreTexts platform; a detailed edit history is available upon request.