Monte Carlo 基于另一个日期模拟一个日期

Monte Carlo Simulation of a date based on another date

我有一个这样的数据集。 date_e 对于状态 =“1”是准确的。我想根据年龄模拟 date_e。因此,new_date_e 将更改为 status="0",对于 status="1" 将相同。此外,status=1 具有更高的风险,因此 df= date_e-status="1" 的平均年龄应该比 "0" 短。

           age      date_e  status  id
1   1950-10-21 2008-11-02      0   1
2   1941-02-11 2006-08-28      0   2
3   1940-01-20 2000-05-25      0   3
4   1957-11-05 2008-03-28      1   4
5   1946-09-15 2004-03-10      0   5

数据是:

library(dplyr)

set.seed(1)

age <- sample(seq(as.Date('1930-01-01'), as.Date('1970-01-01'), by="day"), 1000)
date1 <- sample(seq(as.Date('2000-01-01'), as.Date('2010-01-01'), by="day"), 1000)
status <- sample(c(0, 1), size = 1000, replace = TRUE, prob = c(0.8, 0.2))
df <- data.frame(age, date1, status)
df <- df %>% mutate(id = row_number())

我猜你想要模拟的是 status 对寿命的影响(即在你的可重现示例中 date1age 之间的时间差)。目前status对长寿没有影响:

library(ggplot2)

df %>%
ggplot(aes(x    = factor(status), 
           y    = as.numeric(difftime(date1, age, unit = 'w'))/52,
           fill = factor(status))) + 
  geom_boxplot(width = 0.6) +
  guides(fill = guide_none()) +
  labs(x = 'Status', y = 'Age (years)')

实际上,您需要做的是从 status == 1 所在的 date1 列中减去随机时间量。为此,您可以利用日期在 R 中存储为整数 'under the hood' 这一事实,以及您可以将随机抽取乘以 status 列这一事实,因为 [=20] =] 因此总是减去 0。

所以答案是你只需要做:

df$date1 <- df$date1 - df$status * round(rnorm(nrow(df), 3650, 500))

这将使 status == 1 的人平均减少 10 年,但 status == 0 的人会保留 as-is:

df %>% 
  ggplot(aes(x    = factor(status), 
             y    = as.numeric(difftime(date1, age, unit = 'w'))/52,
             fill = factor(status))) + 
  geom_boxplot(width = 0.6) +
  guides(fill = guide_none()) +
  labs(x = 'Status', y = 'Age (years)')