这是我之前发布的一个问题的后续问题(有关更多详细信息,请参阅Sum over rows with multiple changed conditions R data.table)。我想计算这 3 名受试者在过去 5 年中经历了多少次事件。因此,一直在使用rollapply
from zoo
package 对滚动窗口进行求和。这假设 5 年前的经验与 1 年前的经验一样重要(相同的权重),所以现在我想为输入总和的经验包括一个时间衰减。这基本上意味着 5 年前的经验不会以与 1 年前的经验相同的权重进入总和。
在我的情况下,我想包括一个与年龄相关的衰减(即使对于其他应用程序来说更快或更慢的衰减,例如平方根或平方可能是可能的)。
例如,假设我有以下数据(为了清楚起见,我建立在以前的数据之上):
mydf <- data.frame (Year = c(2000, 2001, 2002, 2004, 2005,
2007, 2000, 2001, 2002, 2003,
2003, 2004, 2005, 2006, 2006, 2007),
Name = c("Tom", "Tom", "Tom", "Fred", "Gill",
"Fred", "Gill", "Gill", "Tom", "Tom",
"Fred", "Fred", "Gill", "Fred", "Gill", "Gill"))
# Create an indicator for the experience
mydf$Ind <- 1
# Load require packages
library(data.table)
library(zoo)
# Set data.table
setDT(mydf)
setkey(mydf, Name,Year)
# Perform cartesian join to calculate experience. I2 is the new experience indicator
m <- mydf[CJ(unique(Name),seq(min(Year)-5, max(Year))),allow.cartesian=TRUE][,
list(Ind = unique(Ind), I2 = sum(Ind,na.rm=TRUE)),
keyby=list(Name,Year)]
# This is the approach I have been taking so far. Note that is a simple rolling sum of I2
m[,Exp := rollapply(I2, 5, function(x) sum(head(x,-1)),
align = 'right', fill=0),by=Name]
所以现在的问题是,我怎样才能在这个计算中包含一个与年龄相关的衰减。为了对此进行建模,我需要在经验进入总和之前将经验除以经验的年龄。
我一直在尝试使用以下方式使其工作:
m[,Exp_age := rollapply(I2, 5, function(x) sum(head(x,-1)/(tail((Year))-head(Year,-1))),
align = 'right', fill=0),by=Name]
但它不起作用。我认为我的主要问题是我无法正确计算体验的年龄,因此我可以除以总和中的年龄。结果应类似于下面的Exp_age
列myres
data.frame
myres <- data.frame(Name = c("Fred", "Fred", "Fred", "Fred", "Fred",
"Gill", "Gill", "Gill", "Gill", "Gill", "Gill",
"Tom", "Tom", "Tom", "Tom", "Tom"),
Year = c(2003, 2004, 2004, 2006, 2007, 2000, 2001, 2005,
2005, 2006, 2007, 2000, 2001, 2002, 2002, 2003),
Ind = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1),
Exp = c(0, 1, 1, 3, 4, 0, 1, 1, 1, 2, 3, 0, 1, 2, 2, 4),
Exp_age = c(0, 1, 1, 1.333333333, 1.916666667, 0, 1, 0.45,
0.45, 2.2, 2, 0, 1, 1.5, 1.5, 2.833333333))
任何指针将不胜感激!