Ограничение вычислений нечетких соединений

Я пытаюсь провести исследование событий, которое оценивает, участвует ли конкретный человек в конкретном событии (событие P) после прохождения определенного лечения (лечение E). Я делаю это, беря наблюдения за событием E и пытаясь объединить их с наблюдениями за событием P, затем я собираюсь создать интервал и оценить его, как показано в примере ниже:

library(tidyverse)
library(fuzzyjoin)

Event_E <- tibble::tribble(
  ~id, ~category,       ~date,
  1L,       "a",  "7/1/2000",
  2L,       "b", "11/1/2000",
  3L,       "c",  "7/1/2002"
) %>%
  mutate(date = as.Date(date, format = "%m/%d/%Y"))

Event_P <- tibble::tribble(
  ~category, ~other_info,     ~start,         ~end,
  "a",         "x", "7/30/2000", "12/31/2000",
  "b",         "y", "11/12/2000", "12/31/2001",
  "b",         "z", "8/1/2002", "12/31/2002"
) %>%
  mutate_at(vars(start, end), as.Date, format = "%m/%d/%Y")


fuzzy_left_join(
  Event_E, Event_P,
  by = c(
    "category" = "category",
    "date" = "start"
  ),
  match_fun = list(`==`, `<=`)
) %>%select(id, category = category.x, date,start)%>%
  group_by(category)%>%slice_min(start)%>%mutate(
  two_weeks=interval(start=date,end=date+weeks(2)),
  P_within=case_when(start%within%two_weeks~"Yes",TRUE~"No"))

Этот процесс отлично работает, за исключением двух проблем: 1) мои фактические данные настолько велики, что они не могут пройти fuzzy_left_join() с созданными дубликатами (мне просто нужен самый быстрый экземпляр события P относительно определенного события E, а не все экземпляров события P для человека, который переживает событие E), 2) мне нужно вести наблюдения, которые не имеют события P (индивидуум 3 / категория c переживает событие E, но никогда не отслеживает событие P, и его отключили из-за NA).

Какие-нибудь советы? Я уверен, что смогу решить проблему 2 с помощью дополнительного слияния, но столкнулся с блокировкой по проблеме 1.


person EconMatt    schedule 19.11.2020    source источник


Ответы (1)


Установка max_dist=30 может помочь, если вы знаете, что самый быстрый экземпляр всегда находится в пределах 30 дней. Или вы можете разбить событие E на 10 частей, пройти их в цикле с помощью fuzzy_left_join, а затем после этого bind_rows.

person Arthur Yip    schedule 06.01.2021