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
对寿命的影响(即在你的可重现示例中 date1
和 age
之间的时间差)。目前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)')
我有一个这样的数据集。 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
对寿命的影响(即在你的可重现示例中 date1
和 age
之间的时间差)。目前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)')