GLM在交互项中调换系数名称

5
我使用的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 

我们可以看到,交互作用的GAMMA.2:VAR1coef名称与form中的顺序不同(我们有VAR1:GAMMA.2代替)。由于多种原因,我需要输出内容。

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

在不改变系数名称的情况下进行翻译。具体来说,我希望系数的名称与form对象中使用的名称相同(不像上面的代码一样切换)。我能告诉glm()不要交换交互的名称吗?

2个回答

4
答案是否定的,如果要重新编写函数的话就可以实现。交互项标签的顺序是由terms.formula函数决定的,而terms.form函数本身是由C代码中深层嵌套的termsform函数决定的。你无法传递参数给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" 

你以后如果需要,可以使用这个向量来映射名称。

更具体地说,罪魁祸首是stats:::C_termsform(参见model.c,第970行及以上)。 - jay.sf

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 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接