我正致力于模拟具有不规则访问结构的纵向数据集。
我想添加一个"参与者年龄访问时间#34;从基线访问开始。
(假设基线年龄为65,并假设时间间隔为(1,1.2,2,2.5),那么我想生成一个名为" age.at.visit"的新变量,它将具有年龄( 65,66,67.2,69.2,71.7)。
基本上,累积间隔为基线年龄65,即(65 + 1,65 + 1 + 1.2,65 + 1.1.2 + 2,65 + 1 + 1.2 + 2 + 2.5)。我已经模拟了基线时的年龄,我想根据参与者的访问次数将时间间隔添加到基线年龄。我正在努力产生累积金额并需要帮助。这是我的尝试
maxvst = 10; # maximum number of visits
nsubj = 100; #number of participants or subjects
nvstsubj = sample(1:maxvst,nsubj,replace=TRUE) # generate visit for each subj
bage=runif(nsubj,65,100) #baseline age
subj=rep(1:nsubj, nvstsubj) # subject ids
#generate visits and age of participants
visit=rep(0,length(subject))
age =rep(0,length(subject))
for (i in 1:nsubj){
idx = subject==i
vi = nvstsubj[i]
visit[idx] = 1:vi
intervals = runif(vi-1,1,3) #generate time intervals to add to baseline age
# generate age at each visits
age[idx]= # ??? cumulative sum over interval
}
答案 0 :(得分:1)
这种类型的东西通常最好保存在列表中。我重新创建了您的数据,以便将其全部保存在一个数据框中。
df <- data.frame(id = 1:100,
num_visits=sample(1:10,100,replace=TRUE),
base_age = runif(100, 65, 100))
数据看起来像这样
head(df,4)
id num_visits base_age
1 1 2 67.90497
2 2 3 70.77535
3 3 6 97.05501
4 4 6 77.31996
然后我将cumsum函数应用于后续访问之间的持续时间,并将其添加到每行的基本年龄。请注意,如果只有超过1次访问,则需要连接基本年龄。
a <- apply(df,1, function(x) {
temp <- as.numeric(x["base_age"] + cumsum(runif(x["num_visits"], 1,2)))
if(length(temp) > 0) temp <- c(x["base_age"], temp)
})
解决方案看起来像这样
[[1]]
base_age
67.90497 69.85027 71.30138
[[2]]
base_age
70.77535 72.34506 73.88659 75.21282
[[3]]
base_age
97.05501 98.57490 100.01887 101.50815 102.52040 104.36888 105.62224
[[4]]
base_age
77.31996 78.65842 80.17729 82.10347 83.60191 85.11311 86.18387