5

私は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.

データを確認しましたが、1つのレベルのみを含む要素はありません。すべての被験者は少なくとも1つの間違った応答と1つの正しい応答を出し、すべてが差別と逆転に参加しました。特定のサブジェクトを指定すると、関数はループの外側で機能します。

4

2 に答える 2

5

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
于 2013-01-23T15:51:15.070 に答える
4

glm現在、 of の行ごとに実行しようとしていますid:

glmそれぞれ個別に forが必要だと思います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
于 2013-01-23T15:38:41.373 に答える