r:在数据框中添加列和新计算的值

时间:2018-10-27 15:02:27

标签: r dataframe

我已经(确实)在“小时论坛”上进行了搜索,并开始感到我正在慢慢发疯,这对我来说似乎是一个非常容易解决的问题。

我想做什么?

基本上,我想模拟临床数据。具体来说,对于每个患者(列1:ID),其任意得分(列3:得分)取决于所分配的治疗组(列2:组)。

set.seed(123)

# Number of subjects in study
n_patients = 1000

# Score: Mean and SDs

mean_verum = 70
sd_verum = 20

mean_placebo = 40
sd_placebo = 20

# Allocating to Treatment groups: 

data = data.frame(id = as.character(1:n_patients))
data$group[1:(n_patients/2)] <- "placebo"
data$group[(n_patients/2+1):n_patients] <- "verum"

# Attach Score for each treatment group
data$score <- ifelse(data$group == "verum", rnorm(n=100, mean=mean_verum, sd=sd_verum), rnorm(n=100, mean=mean_placebo, sd=sd_placebo))

到目前为止很容易。现在,我希望1)根据得分计算事件发生的概率(logit函数)。然后,2)我想根据概率(rbinom)实际分配一个事件。

我想对n个不同的概率/事件执行此操作。这是我到目前为止使用的代码:

计算概率:

a = -1
b = 0.01
p1 = 1-exp(a+b*data$score)/(1+exp(a+b*data$score))
data$p_AE1 <- p1

a = -0.5
b = 0.01
p1 = 1-exp(a+b*data$score)/(1+exp(a+b*data$score))
data$p_AE2 <- p1

…

分配事件:

data$Abbruch_AE1 <- rbinom(n_patients, 1, data$p_E1)
data$Abbruch_AE2 <- rbinom(n_patients, 1, data$p_E2)
…

显然,这确实效率很低,因为它希望根据我要模拟的概率/事件轻松地按比例放大或缩小。

问题是,我根本不知道如何同时实现a)在数据框中生成新的单列,我要在其中输入每个值,b)执行函数以分配概率/事件和c)针对n个不同的公式执行此操作,它们具有特定的a和b。

我确信解决该问题的方法很简单-我无法管理的是一次完成所有这些事情,这就是我最终希望做到的。我玩过for循环,都无济于事。

任何帮助将不胜感激!

这是我的数据框的样子:

structure(list(id = structure(1:3, .Label = c("1", "2", "3"), class = "factor"), 
group = c("placebo", "placebo", "placebo"), score = c(25.791868726014, 
45.1376741831306, 35.0661624307525), p_AE1 = c(0.677450814266315, 
0.633816117436442, 0.656861351663365), p_AE2 = c(0.560226492151216, 
0.512153420188678, 0.537265362130761), p_AE3 = c(0.435875409622676, 
0.389033483248856, 0.413221988111604), p_AE4 = c(0.319098312196655, 
0.278608032377073, 0.299294085148527), p_AE5 = c(0.221332386680766, 
0.189789774534235, 0.205762225373345), p_AE6 = c(0.147051201194953, 
0.124403316086538, 0.135795233451071), p_AE7 = c(0.0946686004658072, 
0.0793379289917946, 0.0870131973838217), p_AE8 = c(0.0596409872667201, 
0.0496714832182721, 0.0546471270895262), AbbruchAE1 = c(1L, 
1L, 1L), AbbruchAE2 = c(1L, 1L, 0L), AbbruchAE3 = c(0L, 0L, 
0L), AbbruchAE4 = c(0L, 1L, 0L), AbbruchAE5 = c(1L, 0L, 0L
), AbbruchAE6 = c(1L, 0L, 0L), AbbruchAE7 = c(0L, 0L, 0L), 
AbbruchAE8 = c(0L, 0L, 0L)), .Names = c("id", "group", "score",  "p_AE1", "p_AE2", "p_AE3", "p_AE4", "p_AE5", "p_AE6", "p_AE7",  "p_AE8", "AbbruchAE1", "AbbruchAE2", "AbbruchAE3", "AbbruchAE4",  "AbbruchAE5", "AbbruchAE6", "AbbruchAE7", "AbbruchAE8"), row.names = c(NA,  3L), class = "data.frame")

0 个答案:

没有答案