«взвешенное» скользящее среднее по группе при исключении значения собственной группы, когда группа имеет несколько наблюдений - PullRequest
0 голосов
/ 20 января 2020

Я пытаюсь вычислить «взвешенное» скользящее среднее значение группы, исключая значение собственной группы, когда группа имеет несколько наблюдений. Это связано с моим более ранним вопросом среднее значение группы с несколькими переменными группирования, исключая значение собственной группы . Ключевое отличие состоит в том, что этот метод неприменим, поскольку в настоящее время группа имеет несколько наблюдений.

Основываясь на следующем наборе данных, вот операция, которую я хочу применить. Например, новая переменная для первых двух строк займет 19 * 9/18 + 48 * 3/18 + 6 * 2/18 + 31 * 4/18 = 25,05. Следующие два ряда займут 81 * 1/10 + 52 * 3/10 + 6 * 2/10 + 31 * 4/10 = 37,3 и так далее.

set.seed(57)
df <- data.frame(
  state = rep(c("AL", "CA"), each = 12),
  year = rep(c(2011:2012), 12),
  county = rep(letters[1:6], each = 4),
  value = sample(100, 24),
  wt = sample(10, 24, replace = T)
) %>% arrange(state, year)

Если я применяю следующий код, проблема заключается в том, что наблюдение из того же округа также включено в формулу взвешенного среднего.

df %>%
  group_by(state, year) %>%
  mutate(new_val = purrr::map_dbl(row_number(), 
                         ~weighted.mean(value[-.x], wt[-.x])))

В качестве обхода я попробовал следующее (сначала найдите средневзвешенное значение в течение первого года в округе и примените приведенный выше код), но эти два результата не дают одинаковых результатов, хотя и в некоторой степени сходных. ,

df %>%
  group_by(state, county, year) %>%
  mutate(wp = weighted.mean(value, wt),
         wt2 = sum(wt)) %>%
  distinct(state, year, county, wp, wt2) %>%
  ungroup() %>%
  group_by(state, year) %>%
  mutate(new_val = purrr::map_dbl(row_number(), 
                                  ~weighted.mean(wp[-.x], wt2[-.x])))

Спасибо, что нашли время, чтобы прочитать это!

1 Ответ

0 голосов
/ 20 января 2020

Я нашел ответ, но уверен, что это не лучший подход. Любые другие предложения будут очень полезны для дальнейшего использования.

x <- c(rep(c(letters[1:3]), 2), rep(c(letters[4:6]), 2))
year <- rep(rep(c(2011:2012), each = 3), time = 2)
state <- rep(c("AL", "CA"), each = 6)

get_wv <- function(x, year, state){

  new_val <- weighted.mean(df$value[df$county != x & df$year == year & df$state == state], 
                                   df$wt[df$county != x & df$year == year & df$state == state])  

  new_val

}

res <- pmap(.l = list(x, year, state), .f = get_wv)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...