for循环中的多个glm

时间:2013-01-23 15:24:38

标签: r for-loop glm

我有一个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)

id作为我的主题(实际上我有2个以上),correct =响应编码为不正确(0)或正确(1),phases歧视和逆转(受试者内因素)。

我想以

的形式进行逻辑回归
glm(correct~phase, dat, family="binomial")

以后可能会添加额外的预测变量。 但是,由于每个科目都有不同数量的数据,我想为每个科目分别执行glm(),然后将系数与ANOVA进行比较,以获得组效果。 我想以

的形式在for循环中执行此操作
for(i in seq_along(dat$id)){
   my_glm[i] <- glm(correct~list,dat[dat$id==i,],family="binomial")
}

但仍然收到错误消息

>Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) :
 contrasts can be applied only to factors with 2 or more levels.

我已检查过我的数据,并且没有任何因素只包含一个级别。所有受试者都给出了至少一个不正确和一个正确的回答,并且都参与了歧视和逆转。当我指定特定主题时,该函数在循环外部工作。

2 个答案:

答案 0 :(得分:4)

您目前正在为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

答案 1 :(得分:4)

这是一个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