R 如何计算时间加权平均值并创建滞后

R 如何计算时间加权平均值并创建滞后,r,lag,weighted-average,R,Lag,Weighted Average,我搜索了论坛,但没有找到任何可以回答或提供如何在论坛上做我想做的事情的提示 我有每年测量的暴露数据,我希望根据每个人进入研究的情况,计算个人水平的年平均值。对于每一行,一年暴露任务应包括从加入研究前最后一个月开始的前12个月的数据。 例如,样本数据中的第一人于2002年2月7日加入了研究。他的风险敞口包括2002年1月(年平均值为18)和2001年2月至12月(年平均值为19)的供款。此人的时间加权平均值为(1/12*18)+(11/12*19)。同一人的两年平均暴露时间将从2002年1月延长至

我搜索了论坛,但没有找到任何可以回答或提供如何在论坛上做我想做的事情的提示

我有每年测量的暴露数据,我希望根据每个人进入研究的情况,计算个人水平的年平均值。对于每一行,一年暴露任务应包括从加入研究前最后一个月开始的前12个月的数据。 例如,样本数据中的第一人于2002年2月7日加入了研究。他的风险敞口包括2002年1月(年平均值为18)和2001年2月至12月(年平均值为19)的供款。此人的时间加权平均值为(1/12*18)+(11/12*19)。同一人的两年平均暴露时间将从2002年1月延长至2000年2月

同样,最后一位于2004年12月加入研究的人,将包括2004年11个月和2003年1个月的供款,其年平均暴露量将从2004年得出(11/12*5),并从2003年的年平均值得出(1/12*6)

我如何计算从进入研究之日起的1年、2年和5年平均暴露量?我怎样才能以我所描述的方式使用滞后

从该链接访问示例数据


这不是一个优雅的答案。但是,我想离开我尝试过的。我首先安排了数据帧。我想确定哪一年是每个科目的关键一年。因此,我创建了
id
<代码>变量来自原始数据集中的列名(例如pol_2000)
entryYear
来自数据中的
entry
entryMonth
也来自
entry
<创建代码>检查,以确定哪一年是每个参与者的基准年。在下一步中,我使用SOfun包中的
getMyRows
为每个参与者提取了六行。在下一步中,我使用了
lappy
,并按照您在问题中描述的方式进行了数学计算。对于两年/五年平均值的计算,我将总值除以年份(2或5)。我不确定最终的输出会是什么样子。因此,我决定对每个主题使用基准年,并在其中添加了三列

library(stringi)
library(SOfun)
devtools::install_github("hadley/tidyr")
library(tidyr)
library(dplyr)


### Big thanks to BondedDust for this function
### http://stackoverflow.com/questions/6987478/convert-a-month-abbreviation-to-a-numeric-month-in-r

mo2Num <- function(x) match(tolower(x), tolower(month.abb))


### Arrange the data frame.
ana <- foo %>%
       mutate(id = 1:n()) %>%
       melt(id.vars = c("id","entry")) %>%
       arrange(id) %>%
       mutate(variable = as.numeric(gsub("^.*_", "", variable)),
              entryYear = as.numeric(stri_extract_last(entry, regex = "\\d+")),
              entryMonth = mo2Num(substr(entry, 3,5)) - 1,
              check = ifelse(variable == entryYear, "Y", "N"))

### Find a base year for each subject and get some parts of data for each participant.
indx <- which(ana$check == "Y")
bob <- getMyRows(ana, pattern = indx, -5:0)


### Get one-year average
cathy <- lapply(bob, function(x){
    x$one <- ((x[6,6] / 12) * x[6,4]) + (((12-x[5,6])/12) * x[5,4])
    x 
})

one <- unnest(lapply(cathy, `[`, i = 6, j = 8))

### Get two-year average
cathy <- lapply(bob, function(x){
    x$two <- (((x[6,6] / 12) * x[6,4]) + x[5,4] + (((12-x[4,6])/12) * x[4,4])) / 2
    x 
})

two <- unnest(lapply(cathy, `[`, i = 6, j =8))


### Get five-year average
cathy <- lapply(bob, function(x){
    x$five <- (((x[6,6] / 12) * x[6,4]) + x[5,4] + x[4,4] + x[3,4] + x[2,4] + (((12-x[2,6])/12) * x[1,4])) / 5 
    x 
})

five <- unnest(lapply(cathy, `[`, i =6 , j =8))

### Combine the results with the key observations
final <- cbind(ana[which(ana$check == "Y"),], one, two, five)
colnames(final) <- c(names(ana), "one", "two", "five")

#   id     entry variable value entryYear entryMonth check       one       two      five
#6   1 07feb2002     2002    18      2002          1     Y 18.916667 18.500000 18.766667
#14  2 06jun2002     2002    16      2002          5     Y 16.583333 16.791667 17.150000
#23  3 16apr2003     2003    14      2003          3     Y 15.500000 15.750000 16.050000
#31  4 26may2003     2003    16      2003          4     Y 16.666667 17.166667 17.400000
#39  5 11jun2003     2003    13      2003          5     Y 13.583333 14.083333 14.233333
#48  6 20feb2004     2004     3      2004          1     Y  3.000000  3.458333  3.783333
#56  7 25jul2004     2004     2      2004          6     Y  2.000000  2.250000  2.700000
#64  8 19aug2004     2004     4      2004          7     Y  4.000000  4.208333  4.683333
#72  9 19dec2004     2004     5      2004         11     Y  5.083333  5.458333  4.800000
库(stringi)
图书馆(索芬)
devtools::install_github(“hadley/tidyr”)
图书馆(tidyr)
图书馆(dplyr)
###非常感谢BondedBust提供此功能
### http://stackoverflow.com/questions/6987478/convert-a-month-abbreviation-to-a-numeric-month-in-r
mo2Num%
熔化(id.vars=c(“id”,“入口”))%>%
排列(id)%>%
mutate(variable=as.numeric(gsub(“^.*.\u”,”,variable)),
entryYear=as.numeric(stri_extract_last(entry,regex=“\\d+”)),
entryMonth=mo2Num(子项(条目,3,5))-1,
check=ifelse(变量==entryYear,“Y”,“N”))
###为每个主题找到一个基准年,并获取每个参与者的部分数据。

indx感谢您提供的代码,它回答了我的一个请求。可能是对计算五年平均值的代码的一个小改动。其中应该包括列表中的第一行“bob”,如下所示:cathy@Meso感谢您的评论。我修改了你提到的部分。我需要考虑一下
lag
在这里是如何工作的。但是,我只是直觉地认为,不知何故,这不是一个正确的方法。如果我现在看到您的原始数据,我仍然认为您可能需要确定每个主题的基准年。然后,你要确定你需要注意哪个值才能得到一定比例的值。我想我所说的是我所做的变化;行操作而不是列操作。如果我有任何关于滞后的想法,我会告诉你的。