访问的累计金额,每个参与者有不同的访问次数

时间:2016-08-06 05:14:59

标签: r

我正致力于模拟具有不规则访问结构的纵向数据集。

我想添加一个"参与者年龄访问时间#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 
}

1 个答案:

答案 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