glm切换交互的系数名称

时间:2014-02-11 13:12:24

标签: r formula glm interaction binomial-coefficients

我使用R代码:

dat<-data.frame(p1=c(0,1,1,0,0), GAMMA.1=c(1,2,3,4,3), VAR1=c(2,2,1,3,4), GAMMA.2=c(1,1,3,4,1))
form <- p1 ~ GAMMA.1:VAR1 + GAMMA.2:VAR1
mod <- glm(formula=form, data=dat, family=binomial)
(coef <- coefficients(mod))

# (Intercept) GAMMA.1:VAR1 VAR1:GAMMA.2 
#   1.7974974   -0.2563667   -0.2181079 

我们可以看到互动coef的{​​{1}}名称与GAMMA.2:VAR1的名称不同(我们改为form)。由于几个原因,我需要输出

VAR1:GAMMA.2

之后不改变系数的名称。具体来说,我希望系数与# (Intercept) GAMMA.1:VAR1 GAMMA.2:VAR1 # 1.7974974 -0.2563667 -0.2181079 对象中使用的系数相同(不进行上述代码中的切换)。我可以告诉form不要切换交互的名称吗?

2 个答案:

答案 0 :(得分:2)

答案是否定的,并非没有很多重写功能。交互项标签的顺序由terms.formula函数确定,termsform函数本身由深埋在C代码中的termsform函数确定。没有可以传递keep.order的参数可以为您提供所需的行为(尽管terms.formula看起来很有前途,但它并不能满足您的需求。)

您需要重写termsform函数,以便在terms.formula输出后“换回”名称,然后使用修补后的版本覆盖terms.formula函数,但是您确定吗?你想要那个?之后更改系数的名称会容易得多。


你也可以抢先使用dat<-data.frame(p1=c(0,1,1,0,0), GAMMA.1=c(1,2,3,4,3), VAR1=c(2,2,1,3,4), GAMMA.2=c(1,1,3,4,1)) form <- p1 ~ GAMMA.1:VAR1 + GAMMA.2:VAR1 new.names<-labels(terms(form,data=dat,keep.order=TRUE)) names(new.names)<-as.character(form[[3]][-1]) new.names # GAMMA.1:VAR1 GAMMA.2:VAR1 # "GAMMA.1:VAR1" "VAR1:GAMMA.2" ,并确定如何重新排序你的公式,然后使用然后创建一个映射向量。

{{1}}

如果您以后需要,可以使用该矢量来映射名称。

答案 1 :(得分:1)

我有两种可能的解决方法。

一种解决方法来自于观察到交互标签中的术语根据其在公式中的出现顺序排序。在您的示例中,订单为GAMMA.1VAR1GAMMA.2。您可以使用不同的顺序重写公式,以使公式和系数名称匹配:

form <- p1 ~ VAR1:GAMMA.1 + VAR1:GAMMA.2
mod <- glm(formula=form, data=dat, family=binomial)
coefficients(mod)

# (Intercept) VAR1:GAMMA.1 VAR1:GAMMA.2 
#   1.7974974   -0.2563667   -0.2181079 

另一种解决方法是在拉出系数时根据公式重命名系数:

rhs_terms <- c("(Intercept)",as.character(form[[3]][2:length(form[[3]])]))
(coef <- setNames(coefficients(mod), rhs_terms))

# (Intercept) GAMMA.1:VAR1 GAMMA.2:VAR1 
#   1.7974974   -0.2563667   -0.2181079