我有一个三因素的连续性表,探讨犯罪行为,入店行窃或其他盗窃行为,性别和先前的定罪以及另一方面的宽松判决之间的关联。 Lenient senteces是这里的响应变量,是二进制的,1表示接收宽松句子,否则为0。
Crime Gender Priorconv Yes No
1 Shoplifting Men N 24 1
2 Other Theft Acts Men N 52 9
3 Shoplifting Women N 48 3
4 Other Theft Acts Women N 22 2
5 Shoplifting Men P 17 6
6 Other Theft Acts Men P 60 34
7 Shoplifting Women P 15 6
8 Other Theft Acts Women P 4 3
您可以使用这些命令重新创建表格
table1<-expand.grid(Crime=factor(c("Shoplifting","Other Theft Acts")),Gender=factor(c("Men","Women")),
Priorconv=factor(c("N","P")))
table1<-data.frame(table1,Yes=c(24,52,48,22,17,60,15,4),No=c(1,9,3,2,6,34,6,3))
我一直试图运行逻辑回归,但当我尝试在变量之间包含交互时很快就遇到了麻烦。 glm在没有相互作用的情况下完美运行。我一直在使用的代码是
fit<-glm(cbind(Yes,No)~Crime+Gender+Priorconv+I(Crime*Priorconv),data=table1,family=binomial)
和我一直在犯的错误
Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) :
contrasts can be applied only to factors with 2 or more levels
In addition: Warning message:
In Ops.factor(Crime, Priorconv) : * not meaningful for factors
你能告诉我如何处理这个错误吗?
谢谢
答案 0 :(得分:5)
通过指定I(Crime*Priorconv)
,您要求R计算值Crime*Priorconv
,它拒绝这样做(因为乘法因子没有意义)。 如果 Crime
和Priorconv
已经是数字虚拟变量(例如0/1编码,0 =入店行窃,1 =其他,0 = N,1 = P)那么它会有意义地将它们相乘,你可以使用I()
表示法来表示你想要乘以它们。
否则(如果不使用I()
),R会将*
解释为“互动加上所有低阶效果”,即Crime*Priorconv
对应于1+Crime+Priorconv+Crime:Priorconv
(其中:
表示交互)。 R将自动处理冗余(即,您已经指定了Crime
和Priorconv
的主效应):在公式上下文中,包括冗余主效应并明确包括截距({{1} })或不是等价的。这些公式都将指定相同的模型:
1
但我更喜欢最后一个:作为@ J.R。在他的回答中指出,你可以利用1+Crime+Priorconv+Crime:Priorconv
Crime+Priorconv+Crime*Priorconv
Crime+Priorconv+Crime:Priorconv
Crime*Priorconv
符号来更紧凑地表达你的模型。
答案 1 :(得分:3)
您可以在公式中使用x:y
来指定x和y之间的交互,例如:
fit<-glm(cbind(Yes,No)~Crime+Gender+Priorconv+Crime:Priorconv,data=table1,family=binomial)
或更短一些:
fit<-glm(cbind(Yes,No)~Gender+Crime*Priorconv,data=table1,family=binomial)