2013-03-02 2 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 

Я хочу, чтобы запустить цикл, чтобы провести glm анализ для каждого отдельного rte (46001,46002, 46003). В пределах каждого rte существует множество year с, и все они должны быть включены в анализ glm. Из теста каждого из маршрутов glm я беру наклон и создаю еще одну таблицу с маршрутом и наклоном в виде столбцов. Это то, что я хочу, чтобы это выглядело как:

rte slope 
46001 x 
46002 y 
46003 z 

Вот для кода петли я придумал:

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

Вам нужно удалить цитаты вокруг 'i' из' data <-subset (bjmd, rte == 'i') '. В настоящее время вы подмножите значения, равные символьной строке '' i''. – Thomas

ответ

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) 
Смежные вопросы