【问题标题】:How to loop with repeated values within a variable?如何循环使用变量中的重复值?
【发布时间】:2013-03-02 19:52:10
【问题描述】:

我有一个名为 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

我想运行一个循环来对每个不同的 rte (46001,46002, 46003) 进行 glm 分析。在每个rte 中,有多个years,它们都需要包含在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

有人可以帮忙指出我在哪里搞砸了吗?

【问题讨论】:

  • 您需要从data&lt;-subset(bjmd, rte=='i') 中删除i 周围的引号。目前,您正在对等于字符串'i' 的值进行子集化。

标签: r loops for-loop glm


【解决方案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)

【讨论】:

    猜你喜欢
    • 2012-10-24
    • 2018-10-11
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多