2014-10-24 4 views
0

Я искал форум, но не нашел ничего, что могло бы ответить или дать понять, как делать то, что я хочу на форуме.Как рассчитать средневзвешенное значение и создать лаги

У меня есть ежегодное измерение данных об экспозиции, из которых я хочу рассчитать среднегодовой уровень среднего уровня, основанный на входе каждого человека в исследование. Для каждой строки одноразовое присвоение должно включать данные за предыдущие 12 месяцев, начиная с последнего месяца, прежде чем присоединиться к исследованию. В качестве примера, первое лицо в выборке данных присоединилось к исследованию 7 февраля 2002 года. В его экспозиции будет внесен вклад в январе 2002 года (средний ежегодный показатель - 18) и с февраля по декабрь 2001 года (в среднем 19 лет). Средневзвешенное по времени для этого человека было бы (1/12 * 18) + (11/12 * 19). Двухлетний средний уровень воздействия на одного и того же человека продолжится с января 2002 года по февраль 2000 года.

Аналогичным образом, для последнего лица, вступившего в исследование в декабре 2004 года, будет внесен взнос за 11 месяцев в 2004 году и один месяц в 2003 году, а его среднегодовой показатель (11/12 * 5), полученный в 2004 году и (1/12 * 6), который исходит из среднегодового показателя 2003 года.

Как рассчитать среднюю экспозицию в течение 1, 2 и 5 лет с даты вступления в исследование? Как я могу использовать лагами так, как я описал?

Sample данные доступны по этой ссылке

https://drive.google.com/file/d/0B_4NdfcEvU7La1ZCd2EtbEdaeGs/view?usp=sharing

ответ

2

Это не элегантный ответ. Но я хотел бы оставить то, что я пробовал. Сначала я организовал кадр данных. Я хотел бы определить, какой год станет ключевым годом для каждого предмета. Итак, я создал id. variable - это имя столбца (например, pol_2000) в исходном наборе данных. entryYear исходит от entry в ваших данных. entryMonth исходит от entry. check был создан, чтобы определить, какой год является базовым годом для каждого участника. На следующем шаге я выделил шесть строк для каждого участника, используя getMyRows в пакете SOfun. На следующем этапе я использовал lapply и сделал математику, как вы описали в своем вопросе. Для расчета среднего значения за два/пять лет я разделил общие значения по годам (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 
+0

Спасибо за код, на который ответил один из моих запросов. Возможно, это небольшое изменение в вашем коде вычисления пятилетнего среднего. который должен содержать строку 1 в вашем списке «bob» следующим образом: 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 }) Обновите свой ответ. Любая идея о том, как запаздывать операторов по этим данным? – Meso

+0

@Meso Спасибо за ваш комментарий. Я пересмотрел указанную вами часть. Мне нужно подумать, как здесь будет работать «лаг». Но я просто интуитивно думаю, что это не будет правильным подходом. Если я сейчас увижу ваши исходные данные, я все же думаю, что вам может понадобиться определить базовый год для каждого предмета. Затем вы хотите определить, какое значение вам нужно позаботиться, чтобы получить определенную долю значений. Я предполагаю, что я говорю, это вариация того, что я сделал; а не столбцов. Если я придумаю с запаздыванием, я дам вам знать. – jazzurro

Смежные вопросы