簡體   English   中英

for循環中的多個glm

[英]Multiple glm in for loop

我有一個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.

我檢查了我的數據,沒有任何因素只包含一個級別。 所有受試者都給出了至少一個不正確和一個正確的回答,並且都參與了歧視和逆轉。 當我指定特定主題時,該函數在循環外部工作。

你目前正試圖為id每一行做一個glm

我認為你需要一個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

這是一個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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM