当解释变量具有多个水平时解释逻辑回归结果

机器算法验证 物流 罗吉特
2022-04-09 14:21:49

当逻辑回归中的解释变量是二元时,解释相对简单。

例如,当您的响应变量是大学录取(二进制:是或否)并且解释变量是性别(有两个水平:女性和男性)时,您可以说男性增加(或减少)被录取的几率n 的因子,保持其他变量不变。

但是什么是具有多个级别/类别的解释变量?例如,您的响应变量是大学录取,但解释变量是种族(级别:高加索人、非洲裔美国人、西班牙裔和亚洲人)。R(或任何其他软件)仍将运行模型,自动选择其中一个级别作为参考(在 R 中,除非另有说明,否则它将是非裔美国人)。结果将告诉我们不是非裔美国人(或反之亦然)如何影响录取几率,但对白种人、西班牙裔或亚裔没有任何影响。

处理这个问题的最佳方法是什么?应该为每个种族创建虚拟变量,还是有更好的方法?

3个回答

超过 2 个级别的分类变量的解释与您提到的二进制情况非常相似;对于级别的分类变量,您将拥有回归系数,每个回归系数将结果与参考组的几率进行比较。对于您陈述的示例,种族(高加索人、非裔美国人、西班牙裔和亚洲人),让我们假设您的参考(基线)组是非裔美国人。一旦您运行回归,许多用于逻辑回归的软件包都会为您提供 3 个优势比(对于 4 级分类预测器)。让我们快速看看在 R 中这是如何基于模拟数据集完成的:kk1

    ###########Simulate Data###########
    set.seed(123) # set seed if you want to re-produce 
                  #simulation results
    x1 <- sample(c("AF","AS","HI","CA"),10000,replace = T) #Caucasian (CA), African-American(AA), Hispanic(HI), 
# and Asian(AA)
    x1 <- factor(x1,levels =c("AF","AS","HI","CA")) 
    # ensure the ordering by setting AF as reference

    x1.fac <- model.matrix(~ x1) # generate dummy variables for 
      #simulation purposes (in practice you may not need to do 
      #this)
    betas <- c(.2,.5,.53) # log odds comparing the three groups 
      #to the referent level of AF (these are just made up 
      #values for illustration and simulation purposes!)
    xbeta <- x1.fac[,-1]%*%betas #need only k-1 dummies for a 
                                 #variable with k-levels
    y <- rbinom(n = 10000, size = 1, prob = 
            exp(xbeta)/(1+exp(xbeta))) # Simulate outcome (Y)

#Finally we have the following sample data:

    example_data <- data.frame(y,x1)
    
    ####Run regression of outcome against ethnicity
    model1 <- glm(y~x1,family = binomial,data = example_data)
    exp(coef(model1))[-1] ###Odds Ratios comparing each group 
                          #with the reference group of AF
    x1AS     x1HI     x1CA 
    1.229610 1.800985 1.796416 

那么亚洲人的优势比 1.23 意味着什么?这意味着,与非裔美国人相比,亚洲人获得结果的几率高出 23%。等效地,您可以解释为与非裔美国人的参照组相比,亚洲人的结果几率是 1.23 倍。白种人和西班牙人的赔率分别为 1.800 和 1.796,以相同的方式解释。对分类变量建模的最重要部分是识别适当的参照组。您始终可以使用 R 中的 relevel() 命令更改参考组。请参见此处的示例。

为了在其中一个不是参照组的两组之间进行比较,有几种方法:

  1. 使用 relevel() 函数并重新运行回归,将参考组更改为您感兴趣的变量(当您的分类预测变量中有很多级别时,这不是我最喜欢的方法)

  2. 使用已经内置的包来做这个比较。

我不确定这是如何在 Stata 或 SAS 中完成的(可能是 SAS 的对比语句),但您可以使用 car 包在 R 中轻松完成此操作。例如,如果要测试高加索人和西班牙人之间结果的几率是否不同,请使用以下命令:

    library(car)
    linearHypothesis(model1, c("x1CA - x1HI = 0"))

    Linear hypothesis test
    
    Hypothesis:
    - x1HI  + x1CA = 0
    
    Model 1: restricted model
    Model 2: y ~ x1
    
      Res.Df Df  Chisq Pr(>Chisq)
    1   9997                     
    2   9996  1 0.0018     0.9658

在这种情况下,我们未能拒绝高加索人和西班牙人之间的结果几率没有差异的原假设(p 值 = 0.9658)。

对于非标称的分类变量,逻辑回归会将系数输出到它的 One Hot Encoded 版本。

因此逻辑保持不变:“高加索人”/“非高加索人”将有一个系数,“西班牙裔”/“非西班牙裔”将有另一个系数,依此类推。编码使得不可能同时具有“高加索人”和“西班牙人”。

这是个好问题,我自己也有过。请注意,如果您只有一个分类变量,则截距项对应于参考类别。如果您的模型中有多个分类变量,那么它就会变得棘手。

一种方法是使用不同的参考水平(笨拙)重新运行模型。

正如您提到的,更好的方法是为每个类别(一个热编码)创建一个虚拟变量。但是,如果您以这种方式估计模型,则需要删除截距项,否则它会被过度参数化。