是否有更简洁的方法从R中的多因素模型中获得个体回归估计

时间:2014-12-11 15:27:18

标签: r regression glm

我已经解决了我想从代码中解脱出来的问题,我正在寻找一种更清晰的方法来获得这个结果?和任何内置函数一样,我不知道谁?

我们有2个相关变量和很多二项式因子(大约200个), 这里用f1和f2说明:

x <- rnorm(100)
y <- rnorm(100)
f1 <- rbinom(100, 1, 0.5)
f2 <- rbinom(100, 1, 0.5)

# which gives the possible groups:
group <- rep(NA, 100)
group[which(f1 & f2)] <- "A"
group[which(!f1 & f2)] <- "B"
group[which(f1 & !f2)] <- "C"
group[which(!f1 & !f2)] <- "D"

df <- data.frame(group,y,x,f1,f2)

我们运行模型选择添加和删除术语和交互,最终结束  对于模型,这里我们说f1和f2以及它们与x的相互作用 作为预测者出现了

m <- glm(y ~ x * f1 + x * f2)

然后我的目标是为每个组制作一个简单的线性模型输出,即: y = a * x + b

# The possible groups:
groups <- data.frame(groups = c("A", "B", "C", "D"), f1=c(1,0,1,0), f2=c(1,1,0,0))

interactions <- grep(":", attr(m$terms, "term.labels"))
factors <- attr(m$terms, "term.labels")[-c(1,interactions)]
interaction.terms <- substring(attr(m$terms, "term.labels")[interactions], 3)

functions <- data.frame(groups$groups, intercept=NA, slope=NA)

for(i in seq(along=groups$groups)) {
  intercept <- coef(m)["(Intercept)"] + sum(groups[i, factors]*coef(m)[factors])
  slope <- coef(m)["x"] +  sum(groups[i, interaction.terms]*coef(m)[paste("x:", interaction.terms, sep="")])

  functions[i, "intercept"] <- intercept
  functions[i, "slope"] <- slope  
}

这给出了这样的输出:

> functions
  groups.groups   intercept       slope
1             A -0.10932806 -0.07468630
2             B -0.37755949 -0.17769345
3             C  0.23635139  0.18406047
4             D -0.03188004  0.08105332

输出是正确的,我想要的是什么。所以这很好。我只是认为这种方法非常复杂。我似乎无法找到更清晰的方法来解决这些问题。

1 个答案:

答案 0 :(得分:1)

我可能会建议您使用predict()。截距只是时间x=0的值,斜率是x=1x=0之间的值的差异。所以你可以做到

int <- predict(m, cbind(groups,x=0))
t1 <- predict(m, cbind(groups,x=1))

data.frame(group=groups$groups, int=int, slope=t1-int)

您没有为您的示例设置种子,因此您的确切结果不可重复,但如果您在样本生成之前执行set.seed(15),则应该

  group         int       slope
1     A -0.08372785 -0.16037708
2     B -0.03904330  0.14322623
3     C  0.16455660 -0.02951151
4     D  0.20924114  0.27409179

使用两种方法