将glmer输出(logit回归)转换为概率

时间:2020-07-13 22:27:51

标签: r regression

我有这样的数据。我正在所有Q变量上运行glm。

dat <- read_table2("condition   school  Q5_3    Q6  Q7_1    Q7_2    Q7_3    Q7_4    Q13_1   Q13_2   Q13_3
0   A   1   1   1   1   1   1   0   1   1
1   B   1   0   0   NA  NA  NA  NA  1   1
1   C   1   0   1   1   1   1   0   1   1
1   A   0   0   0   NA  NA  NA  NA  1   1
1   B   1   0   0   NA  NA  NA  NA  1   1
0   C   1   1   1   1   1   0   0   0   0
0   A   0   0   0   NA  NA  NA  NA  NA  NA
0   B   1   1   1   1   1   1   1   1   1
0   C   1   1   0   NA  NA  NA  NA  1   0
0   A   1   0   0   NA  NA  NA  NA  1   0
0   B   1   0   1   1   0   1   1   NA  NA
0   C   1   0   1   1   1   1   1   1   0
1   A   1   1   1   1   0   1   0   1   1
1   B   0   0   0   NA  NA  NA  NA  1   1
0   C   1   0   0   NA  NA  NA  NA  NA  NA
")

这是我用来提取所需系数的循环。

# We only need the condition and school
# Apply
models <- function(x)
{
  model1 <- glmer(x~ (1|school) + condition ,data=dat , family = binomial, na.action = na.exclude)
  return(model1)
}


y <- apply(dat[,-c(1,2)],2,models)
#Extract results
extract <- function(x)
{
  z <- as.data.frame(summary(x)$coefficient)
  z$id <- rownames(z)
  z <- z[,c(dim(z)[2],1:(dim(z)[2]-1))]
  rownames(z)<-NULL
  return(z)
}
#Extract summary with function
DF <- as.data.frame(do.call(rbind,lapply(y,extract)))
#Format variables
DF$var <- gsub("\\..*","",rownames(DF))
#Arrange columns
DF_glm <- DF[,c(dim(DF)[2],1:(dim(DF)[2]-1))]
rownames(DF)<-NULL

此循环工作正常,但我需要将输出(系数)从对数赔率转换为概率。有关如何执行此操作的任何建议?

2 个答案:

答案 0 :(得分:2)

坏消息:实际上没有任何明智的方法将logistic回归的系数(在log-odds-ratio或logit等级上)转换为概率等级。从对数奇数到概率的转换取决于基线水平,因此要获得概率,您必须对特定情况进行概率预测:例如,参见this CrossValidated question

好消息:对系数求幂可以得到奇数比,与log-odds-ratio相比,它通常被很好地理解并且可以说更容易理解。

library(broom.mixed)
dd <- dat[,-c(1,2)]
## find (and drop) examples with no variation
uu <- apply(dd,2,function(x) length(unique(na.omit(x))))
modList <- apply(dd[,uu>1],2,models)
## generate list of models
purrr:::map_dfr(modList,tidy,
        effect="fixed",
        exponentiate=TRUE,.id="Q")

这会为您提供一张表格(小记号),其中包含优势比标度,标准误,p值等的估算值。如果需要置信区间,还可以使用其他选项,例如conf.int=TRUE在桌子上。您可以使用任何tidyverse工具进行操作(例如,%>% filter(term=="condition"),如果您对截距不感兴趣)。

此示例中的许多答案都是伪造的,但这是因为您的数据集太小了……我希望您的实际数据集比这个大……


解释为什么通常不能将比值转换为概率(不指定基线)实际上更多是一个统计问题/ CrossValidated问题,但是我将基于the UCLA stats site给出一个简短示例

  • 导入数据:缩放GRE和GPA的预测变量以获取更多可解释的参数值。
library(tidyverse)
dd <- (haven::read_dta("https://stats.idre.ucla.edu/stat/stata/dae/binary.dta")
    %>% mutate_at(c("gre","gpa"), ~drop(scale(.)))
)
  • 拟合模型并提取系数
m <- glm(admit~gre+gpa, family=binomial, dd)
cc <- coef(m)
## (Intercept)         gre         gpa 
##  -0.8097503   0.3108184   0.2872088
  • 转换:

plogis()是用于逆向logit(逻辑)转换的内置R函数。

转换拦截参数确实有意义:它给出了具有基线特征的个人的预测概率;由于我们已将预测变量居中,因此它对应于具有总体平均GPA和GRE的个体。

int_prob <- plogis(cc["(Intercept)"])  ## 0.307

我们还可以预测平均GRE且GPA高于平均值一个标准偏差的个体的概率(GPA参数的单位为“每个标准偏差”,因为我们通过其标准偏差对GPA变量进行了缩放):

gre_prob <- with(as.list(cc), plogis(`(Intercept)`+gre)) ## 0.3777

我们可以计算出这些预测之间的差异,这是确定GRE对概率规模的影响的一种方法:

gre_prob-int_prob ## 0.0698

但是,它仅适用于此特定比较(平均GPA和GRE 1 SD高于平均水平的个人与平均GPA和GRE的个人相比)。如果我们从不同的基线开始或对不同的GRE变化进行预测,则每单位GRE概率的变化将有所不同。

如果需要,可以对GRE系数进行逻辑变换:

plogis(cc["gre"])  ## 0.577

这是什么意思?如果您随后将其GRE增加1个标准差,则它是基线对数奇数为零的个人成功的概率(这不是具有平均GPA和GRE的个人的不是)。不是一件容易解释的事情...

还有其他一些经验法则/近似法可以理解log-odds-ratios的含义,例如divide by 4 rule,但它们都在某种程度上取决于指定基线水平。

答案 1 :(得分:0)

您可以尝试一下。由于您的数据,您将收到警告:

library(lme4)
#Preprocess data
#If you omit NA variables will be constants so that the model
#can no be fitted and will produce error
#I set NA to zero in order to get models working
#Please check your data
dat[is.na(dat)] <- 0
# We only need the condition and school
# Apply
models <- function(x)
{
  model1 <- glmer(x~ (1|school) + condition ,data=dat , family = binomial, na.action = na.exclude)
  return(model1)
}

y <- apply(dat[,-c(1,2)],2,models)
#Extract results and we will extract the logs
extract <- function(x)
{
  z <- as.data.frame(summary(x)$coefficient)
  z$id <- rownames(z)
  z <- z[,c(dim(z)[2],1:(dim(z)[2]-1))]
  z$odds <- exp(z$Estimate)
  z$prob <- z$odds / (1 + z$odds)
  rownames(z)<-NULL
  return(z)
}

#Extract summary with function
DF <- as.data.frame(do.call(rbind,lapply(y,extract)))
#Format variables
DF$var <- gsub("\\..*","",rownames(DF))
#Arrange columns
DF_glm <- DF[,c(dim(DF)[2],1:(dim(DF)[2]-1))]
rownames(DF)<-NULL

您将得到这个:

            id      Estimate   Std. Error       z value   Pr(>|z|)         odds
1  (Intercept)  2.079442e+00 1.060660e+00  1.960517e+00 0.04993534 8.000000e+00
2    condition -1.386294e+00 1.369306e+00 -1.012407e+00 0.31134363 2.500000e-01
3  (Intercept) -2.231436e-01 6.708203e-01 -3.326428e-01 0.73940393 8.000000e-01
4    condition -1.386294e+00 1.284523e+00 -1.079229e+00 0.28048568 2.500000e-01
5  (Intercept)  2.231436e-01 6.708203e-01  3.326428e-01 0.73940394 1.250000e+00
6    condition -9.162907e-01 1.095445e+00 -8.364553e-01 0.40289882 4.000000e-01
7  (Intercept)  2.231436e-01 6.708203e-01  3.326428e-01 0.73940394 1.250000e+00
8    condition -9.162907e-01 1.095445e+00 -8.364553e-01 0.40289882 4.000000e-01
9  (Intercept) -2.231436e-01 6.708204e-01 -3.326428e-01 0.73940397 8.000000e-01
10   condition -1.386294e+00 1.284523e+00 -1.079229e+00 0.28048583 2.500000e-01
11 (Intercept) -2.231436e-01 6.708204e-01 -3.326428e-01 0.73940395 8.000000e-01
12   condition -4.700036e-01 1.095445e+00 -4.290527e-01 0.66788485 6.250000e-01
13 (Intercept) -7.440587e-01 1.454336e+00 -5.116141e-01 0.60892109 4.751814e-01
14   condition -5.938497e+04 2.739708e+07 -2.167566e-03 0.99827053 0.000000e+00
15 (Intercept)  2.231435e-01 6.708204e-01  3.326427e-01 0.73940398 1.250000e+00
16   condition  3.442056e+01 1.351269e+07  2.547276e-06 0.99999797 8.884999e+14
17 (Intercept) -1.252763e+00 8.017837e-01 -1.562470e+00 0.11817732 2.857143e-01
18   condition  3.800559e+01 2.739708e+07  1.387213e-06 0.99999889 3.203452e+16
        prob   var
1  0.8888889  Q5_3
2  0.2000000  Q5_3
3  0.4444444    Q6
4  0.2000000    Q6
5  0.5555556  Q7_1
6  0.2857143  Q7_1
7  0.5555556  Q7_2
8  0.2857143  Q7_2
9  0.4444444  Q7_3
10 0.2000000  Q7_3
11 0.4444444  Q7_4
12 0.3846154  Q7_4
13 0.3221173 Q13_1
14 0.0000000 Q13_1
15 0.5555556 Q13_2
16 1.0000000 Q13_2
17 0.2222222 Q13_3
18 1.0000000 Q13_3