为泊松回归操作数据 table:添加零行和滞后变量
Manipulating a data table for Poisson regression: adding rows of zeros and lagging variables
我正在处理一个捕鱼船队的大型数据集,我需要将其格式化以用于泊松回归和其他计数模型。有关数据的子集,请参见下文。计数变量是 'days'。 p1:p3为港口组指标变量,f1:f4为其他渔业指标变量activity.
yr week id days rev p1 p2 p3 f1 f2 f3 f4
2016 3 1 1 5568.3 0 1 0 0 0 0 0
2016 4 1 3 8869.53 0 1 0 0 0 0 0
2016 5 1 2 12025.8 0 1 0 0 0 0 0
2016 6 1 2 9126.6 0 1 0 0 0 0 0
2016 7 1 3 4415.4 0 1 0 0 0 0 0
2016 8 1 2 11586.6 0 1 0 0 0 0 0
2016 10 1 1 2144.4 0 1 0 0 0 0 0
2016 11 1 1 2183.25 0 1 0 0 0 0 0
2016 14 1 2 4998 0 1 0 0 0 0 0
2016 15 1 3 117 0 1 0 0 0 0 0
2016 1 2 4 12743.3 0 0 1 1 1 0 0
2016 2 2 2 7473.48 0 0 1 1 0 0 0
2016 5 2 2 8885.52 0 0 1 1 0 0 0
2016 7 2 1 15330.6 0 0 1 1 1 0 0
2016 8 2 2 3763.8 0 0 1 1 1 0 0
2016 9 2 1 2274.05 0 0 1 1 1 0 0
这些行仅代表活跃周数,但我需要合并每艘船的非活跃周数。例如,对于 id=1,在 2016 年 (yr),我需要添加从 week=1 开始的行,然后是第 9、12 和 13 周的行。这些行将需要在虚拟行中维护相同的信息类别(这些不会按年改变),并且在 'days' 列中有零。我不需要在该年份和容器的 'week' 的最后一个值之后添加行。
这就是事情变得非常复杂的地方:
在这些新创建的行的收入 (rev) 列中,我需要添加共享同一港口组 (p1:p3) 的所有船只在该周和该年的平均收入。
最后,我需要添加一个新的滞后收入列。对于每一行,滞后收入的值应该是该年该船前一周的 'rev' 列中的值。
每艘船第 1 周的价值应该是该船当年前两周收入的平均值。
这个任务把我的数据处理技能击得粉碎,我的头撞到墙上开始疼了。任何建议将不胜感激!谢谢
要按周、年、p1、p2 和 p3 获取平均收入,只需使用聚合函数:
average_rev <- aggregate(rev~week+year+p1+p2+p3, data=your_dataframe, FUN=mean)
要添加新的滞后收入列:
your_dataframe$lagged_rev <- c(NA, your_dataframe$rev[1:(nrow(_your_dataframe)-1)])
要获得过去两周的平均转化率:
your_dataframe$avg_rev <- rowMeans(your_dataframe[,c('rev','lagged_rev')])
感谢https://whosebug.com/users/3001626/david-arenburg, and https://whosebug.com/users/2802241/user2802241,问题已解决。您可以在以下位置的添加行部分看到 post:
test<-data.frame(DT %>%
group_by(yr, id) %>%
complete(week = 1:max(week)) %>%
replace_na(list(days = 0)) %>%
group_by(yr, id) %>%
mutate_each(funs(replace(., is.na(.), mean(., na.rm = T))), p1:f4))
poisson<-data.table(test)
setkey(poisson,yr,id,week)
avrev<-poisson[,.(avrev = mean(rev,na.rm=T)),by=.(p1,p2,[p3,week,yr)]
avrev<-transform(avrev,xyz=interaction(p1,p2,p3,week,yr,sep=''))
poisson<-transform(poisson,xyz=interaction(tier200,tier300,tier500,week,yr,sep=''))
poisson<-transform(poisson,uniqueid=interaction(drvid,season,sep=''))
poisson$rev[is.na(poisson$rev)]<- avrev$avrev[match(poisson$xyz[is.na(poisson$rev)],avrev$xyz)]
poisson[, lagrev:=c(rev[1], rev[-.N]), by=uniqueid]
我确信有更好更简洁的方法来完成任务,但这行得通。 David Arenburg 还在评论部分 post 编辑了一个答案,该答案利用 data.table 创建新行 - 请参阅其他 post.
我正在处理一个捕鱼船队的大型数据集,我需要将其格式化以用于泊松回归和其他计数模型。有关数据的子集,请参见下文。计数变量是 'days'。 p1:p3为港口组指标变量,f1:f4为其他渔业指标变量activity.
yr week id days rev p1 p2 p3 f1 f2 f3 f4
2016 3 1 1 5568.3 0 1 0 0 0 0 0
2016 4 1 3 8869.53 0 1 0 0 0 0 0
2016 5 1 2 12025.8 0 1 0 0 0 0 0
2016 6 1 2 9126.6 0 1 0 0 0 0 0
2016 7 1 3 4415.4 0 1 0 0 0 0 0
2016 8 1 2 11586.6 0 1 0 0 0 0 0
2016 10 1 1 2144.4 0 1 0 0 0 0 0
2016 11 1 1 2183.25 0 1 0 0 0 0 0
2016 14 1 2 4998 0 1 0 0 0 0 0
2016 15 1 3 117 0 1 0 0 0 0 0
2016 1 2 4 12743.3 0 0 1 1 1 0 0
2016 2 2 2 7473.48 0 0 1 1 0 0 0
2016 5 2 2 8885.52 0 0 1 1 0 0 0
2016 7 2 1 15330.6 0 0 1 1 1 0 0
2016 8 2 2 3763.8 0 0 1 1 1 0 0
2016 9 2 1 2274.05 0 0 1 1 1 0 0
这些行仅代表活跃周数,但我需要合并每艘船的非活跃周数。例如,对于 id=1,在 2016 年 (yr),我需要添加从 week=1 开始的行,然后是第 9、12 和 13 周的行。这些行将需要在虚拟行中维护相同的信息类别(这些不会按年改变),并且在 'days' 列中有零。我不需要在该年份和容器的 'week' 的最后一个值之后添加行。
这就是事情变得非常复杂的地方:
在这些新创建的行的收入 (rev) 列中,我需要添加共享同一港口组 (p1:p3) 的所有船只在该周和该年的平均收入。
最后,我需要添加一个新的滞后收入列。对于每一行,滞后收入的值应该是该年该船前一周的 'rev' 列中的值。
每艘船第 1 周的价值应该是该船当年前两周收入的平均值。
这个任务把我的数据处理技能击得粉碎,我的头撞到墙上开始疼了。任何建议将不胜感激!谢谢
要按周、年、p1、p2 和 p3 获取平均收入,只需使用聚合函数:
average_rev <- aggregate(rev~week+year+p1+p2+p3, data=your_dataframe, FUN=mean)
要添加新的滞后收入列:
your_dataframe$lagged_rev <- c(NA, your_dataframe$rev[1:(nrow(_your_dataframe)-1)])
要获得过去两周的平均转化率:
your_dataframe$avg_rev <- rowMeans(your_dataframe[,c('rev','lagged_rev')])
感谢https://whosebug.com/users/3001626/david-arenburg, and https://whosebug.com/users/2802241/user2802241,问题已解决。您可以在以下位置的添加行部分看到 post:
test<-data.frame(DT %>%
group_by(yr, id) %>%
complete(week = 1:max(week)) %>%
replace_na(list(days = 0)) %>%
group_by(yr, id) %>%
mutate_each(funs(replace(., is.na(.), mean(., na.rm = T))), p1:f4))
poisson<-data.table(test)
setkey(poisson,yr,id,week)
avrev<-poisson[,.(avrev = mean(rev,na.rm=T)),by=.(p1,p2,[p3,week,yr)]
avrev<-transform(avrev,xyz=interaction(p1,p2,p3,week,yr,sep=''))
poisson<-transform(poisson,xyz=interaction(tier200,tier300,tier500,week,yr,sep=''))
poisson<-transform(poisson,uniqueid=interaction(drvid,season,sep=''))
poisson$rev[is.na(poisson$rev)]<- avrev$avrev[match(poisson$xyz[is.na(poisson$rev)],avrev$xyz)]
poisson[, lagrev:=c(rev[1], rev[-.N]), by=uniqueid]
我确信有更好更简洁的方法来完成任务,但这行得通。 David Arenburg 还在评论部分 post 编辑了一个答案,该答案利用 data.table 创建新行 - 请参阅其他 post.