2013-03-02 54 views
0

我有一个名为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内,有多个year s,它们全都需要包含在glm分析中。从每条路线的glm测试中,我将采用坡度并创建另一个路线和坡度作为列的表格。这是我希望它看起来像:

rte slope 
46001 x 
46002 y 
46003 z 

下面是循环代码我想出了:因为我一直得到0值我斜率

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 

东西是不对的代码:

route slope 
1 46001  0 
2 46002  0 
3 46003  0 

有人可以帮指出哪里我搞乱它呢?

+0

您需要从'data <-subset(bjmd,rte =='i')''周围移除'i'的引号。目前,您正在对与字符串“i”相等的值进行子集化。 – Thomas 2013-07-06 14:42:49

回答

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)