4

我使用 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,交互的名称与GAMMA.2:VAR1中的顺序不同form(我们有VAR1:GAMMA.2相反的顺序)。由于几个原因,我需要输出

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

之后不更改系数的名称。具体来说,我希望系数的名称与我在form对象中使用的名称相同(无需像上面的代码那样切换)。我可以告诉glm()不要切换交互的名称吗?

4

2 回答 2

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" 

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

于 2014-02-11T14:03:59.023 回答
1

我有两个可能的解决方法给你。

一种解决方法是观察到交互标签中的术语根据它们在公式中的出现顺序进行排序。在您的示例中,顺序为GAMMA.1, VAR1, GAMMA.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 
于 2014-02-11T14:04:09.047 回答