我有这样的数据。我正在所有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
此循环工作正常,但我需要将输出(系数)从对数赔率转换为概率。有关如何执行此操作的任何建议?
答案 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给出一个简短示例
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