我已经解决了我想从代码中解脱出来的问题,我正在寻找一种更清晰的方法来获得这个结果?和任何内置函数一样,我不知道谁?
我们有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
输出是正确的,我想要的是什么。所以这很好。我只是认为这种方法非常复杂。我似乎无法找到更清晰的方法来解决这些问题。
答案 0 :(得分:1)
我可能会建议您使用predict()
。截距只是时间x=0
的值,斜率是x=1
和x=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
使用两种方法