我有一个 R 数据框,被大大简化为:
id <- rep(1:2, c(6,8))
correct <- sample(0:1,14,TRUE)
phase <- c(rep("discr",3),rep("rev",3), rep("discr",4),rep("rev",4))
dat <- data.frame(id,correct,phase)
Run Code Online (Sandbox Code Playgroud)
作为id我的受试者(实际上我的受试者远不止 2 个),correct= 响应编码为不正确 (0) 或正确 (1),以及phases歧视和逆转(受试者内因素)。
我想以以下形式执行逻辑回归
glm(correct~phase, dat, family="binomial")
Run Code Online (Sandbox Code Playgroud)
稍后可能会添加额外的预测变量。然而,由于每个受试者的数据量不同,我想glm()对每个受试者单独执行,然后将系数与方差分析进行比较以了解群体效应。我想在 for 循环中以以下形式执行此操作
for(i in seq_along(dat$id)){
my_glm[i] <- glm(correct~list,dat[dat$id==i,],family="binomial")
}
Run Code Online (Sandbox Code Playgroud)
但不断收到错误消息
>Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) :
contrasts can be applied only to factors with 2 or more levels.
Run Code Online (Sandbox Code Playgroud)
我检查了我的数据,没有任何因素只包含一个水平。所有受试者都至少给出一项错误和一项正确反应,并且所有人都参与了歧视和逆转。当我指定特定主题时,该函数在循环外工作。
这是一个 R Base 解决方案:
> lapply(split(dat, dat$id), function(x) coef(summary(glm(correct~phase,family="binomial",data=x))))
$`1`
Estimate Std. Error z value Pr(>|z|)
(Intercept) -6.931472e-01 1.224745 -5.659524e-01 0.5714261
phaserev -3.845925e-16 1.732050 -2.220446e-16 1.0000000
$`2`
Estimate Std. Error z value Pr(>|z|)
(Intercept) 3.356998e-16 1.000000 3.356998e-16 1.000000
phaserev 1.098612e+00 1.527524 7.192109e-01 0.472011
Run Code Online (Sandbox Code Playgroud)
glm您当前正在尝试对以下中的每一行执行id:
我想你想要glm每个id单独的。 就我个人而言,我会选择类似的东西:
library(plyr)
ddply(dat, .(id), function (x){
intercept <- coef(summary(glm(correct~phase,family="binomial",data=x)))[1]
slope <- coef(summary(glm(correct~phase,family="binomial",data=x)))[2]
c(intercept,slope)
})
# id V1 V2
#1 1 -0.6931472 1.386294e+00
#2 2 1.0986123 -6.345448e-16
# here V1 is intercept and V2 is the estimate
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4231 次 |
| 最近记录: |