我有一个名为bjmd
的数据集,看起来像这样(简化):
rte year y obs
22037 46001 1 0 1
22042 46001 2 4 3
22047 46001 3 5 3
22202 46002 1 11 1
22207 46002 2 14 1
22212 46002 3 6 1
22140 46003 1 5 6
22141 46003 2 2 6
22142 46003 3 6 6
我想运行一个循环来对每个不同的glm
(46001,46002,46003)进行rte
分析。在每个rte
内,有多个year
,它们都需要包含在glm
分析中。从每条路线的glm
测试中,我将采用斜率并创建另一个路径和斜率为列的表。这就是我想要的样子:
rte slope
46001 x
46002 y
46003 z
这是我提出的for循环代码:
route<-with(bjmd,unique(rte))
slope<-with(bjmd,numeric(length(unique(rte))))
table<-data.frame(route,slope)
for (i in unique(as.factor(bjmd$rte))) {
data<-subset(bjmd, rte=='i')
slope[i] <- coef(summary(glm(y ~ year+obs,
family = poisson(link=log),data=data)))[2,1]
table[i,2] <-paste(slope[i])
})
table
此代码有问题,因为我的斜率值为0:
route slope
1 46001 0
2 46002 0
3 46003 0
有人可以帮忙指出我搞砸了吗?
答案 0 :(得分:1)
不需要循环;只需使用split
即可根据rte
将数据集拆分为多个组。然后使用lapply
将模型拟合到每个组。
lapply(split(bjmd, bjmd$rte), function(dat) glm(y ~ year + obs, data=dat))
您还可以使用交互术语一次性对所有内容进行建模。预测值将是相同的,但是剩余偏差,df和因此P值将是不同的。哪种方法更适合您的需求取决于您的项目。
glm(y ~ (year + obs) * factor(rte), data=bjmd)