Saltar al contenido principal
LibreTexts Español

27.4: Extendiendo la Regresión a Resultados Binarios.

  • Page ID
    150912
  • \( \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}}\)

    \( \newcommand{\vectorA}[1]{\vec{#1}}      % arrow\)

    \( \newcommand{\vectorAt}[1]{\vec{\text{#1}}}      % arrow\)

    \( \newcommand{\vectorB}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)

    \( \newcommand{\vectorC}[1]{\textbf{#1}} \)

    \( \newcommand{\vectorD}[1]{\overrightarrow{#1}} \)

    \( \newcommand{\vectorDt}[1]{\overrightarrow{\text{#1}}} \)

    \( \newcommand{\vectE}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash{\mathbf {#1}}}} \)

    \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)

    \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)

    Digamos que tenemos un análisis de sangre (al que a menudo se le conoce como biomarcador) y queremos saber si predice quién va a tener un ataque al corazón dentro del próximo año. Generaremos un conjunto de datos sintéticos para una población que está en muy alto riesgo de sufrir un ataque cardíaco en el próximo año.

    # sample size
    npatients=1000
    
    # probability of heart attack
    p_heartattack = 0.5
    
    # true relation to biomarker
    true_effect <- 0.6
    
    # assume biomarker is normally distributed
    disease_df <- tibble(biomarker=rnorm(npatients))
    
    # generate another variable that reflects risk for 
    # heart attack, which is related to the biomarker
    disease_df <- disease_df %>%
      mutate(risk = biomarker*true_effect + rnorm(npatients))
    
    # create another variable that shows who has a 
    # heart attack, based on the risk variable
    disease_df <- disease_df %>%
      mutate(
        heartattack = risk > quantile(disease_df$risk,
                                           1-p_heartattack))
    
    glimpse(disease_df)
    ## Observations: 1,000
    ## Variables: 3
    ## $ biomarker   <dbl> 1.15, 0.68, 1.21, -0.72, -1.00, -0.12…
    ## $ risk        <dbl> 1.054, -0.529, 0.675, -0.474, -1.398,…
    ## $ heartattack <lgl> TRUE, FALSE, TRUE, FALSE, FALSE, TRUE…

    Ahora nos gustaría construir un modelo que nos permita predecir quién tendrá un infarto a partir de estos datos. Sin embargo, es posible que hayas notado que la variable heartattack es una variable binaria; debido a que la regresión lineal asume que los residuales del modelo se distribuirán normalmente, y la naturaleza binaria de los datos violará esto, en cambio necesitamos usar un tipo diferente de modelo, conocido como logístico modelo de regresión, que se construye para tratar los resultados binarios. Podemos ajustar este modelo usando la función glm ():

    glm_result <- glm(heartattack ~ biomarker, data=disease_df,
                      family=binomial())
    summary(glm_result)
    ## 
    ## Call:
    ## glm(formula = heartattack ~ biomarker, family = binomial(), data = disease_df)
    ## 
    ## Deviance Residuals: 
    ##     Min       1Q   Median       3Q      Max  
    ## -2.1301  -1.0150   0.0305   1.0049   2.1319  
    ## 
    ## Coefficients:
    ##             Estimate Std. Error z value Pr(>|z|)    
    ## (Intercept) -0.00412    0.06948   -0.06     0.95    
    ## biomarker    0.99637    0.08342   11.94   <2e-16 ***
    ## ---
    ## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
    ## 
    ## (Dispersion parameter for binomial family taken to be 1)
    ## 
    ##     Null deviance: 1386.3  on 999  degrees of freedom
    ## Residual deviance: 1201.4  on 998  degrees of freedom
    ## AIC: 1205
    ## 
    ## Number of Fisher Scoring iterations: 3

    Esto se parece mucho a la salida de la función lm (), y nos muestra que existe una relación significativa entre el biomarcador y los ataques cardíacos. El modelo nos proporciona una probabilidad predicha de que cada individuo tendrá un ataque al corazón; si esto es mayor a 0.5, entonces eso significa que el modelo predice que el individuo es más probable que no tenga un ataque cardíaco.
    Podemos comenzar simplemente comparando esas predicciones con los resultados reales.

    # add predictions to data frame
    disease_df <- disease_df %>%
      mutate(prediction = glm_result$fitted.values>0.5,
             heartattack = heartattack)
    
    # create table comparing predicted to actual outcomes
    CrossTable(disease_df$prediction,
               disease_df$heartattack,
               prop.t=FALSE,
               prop.r=FALSE,
               prop.chisq=FALSE)
    ## 
    ##  
    ##    Cell Contents
    ## |-------------------------|
    ## |                       N |
    ## |           N / Col Total |
    ## |-------------------------|
    ## 
    ##  
    ## Total Observations in Table:  1000 
    ## 
    ##  
    ##                       | disease_df$heartattack 
    ## disease_df$prediction |     FALSE |      TRUE | Row Total | 
    ## ----------------------|-----------|-----------|-----------|
    ##                 FALSE |       332 |       157 |       489 | 
    ##                       |     0.664 |     0.314 |           | 
    ## ----------------------|-----------|-----------|-----------|
    ##                  TRUE |       168 |       343 |       511 | 
    ##                       |     0.336 |     0.686 |           | 
    ## ----------------------|-----------|-----------|-----------|
    ##          Column Total |       500 |       500 |      1000 | 
    ##                       |     0.500 |     0.500 |           | 
    ## ----------------------|-----------|-----------|-----------|
    ## 
    ## 

    Esto nos muestra que de las 500 personas que tuvieron infartos, el modelo corregido predijo un infarto para 343 de ellos. También predijo ataques cardíacos para 168 personas que no los tenían, y no logró predecir un ataque al corazón para 157 personas que los tuvieron. Esto resalta la distinción que mencionamos anteriormente entre significación estadística y práctica; aunque el biomarcador muestra una relación altamente significativa con los ataques cardíacos, su capacidad para predecirlos sigue siendo relativamente pobre. Como veremos a continuación, empeora aún más cuando tratamos de generalizar esto a un nuevo grupo de personas.


    This page titled 27.4: Extendiendo la Regresión a Resultados Binarios. is shared under a not declared license and was authored, remixed, and/or curated by Russell A. Poldrack via source content that was edited to the style and standards of the LibreTexts platform; a detailed edit history is available upon request.