在R中创建带有单个次要案例的分支过程
我是这个论坛的新手,所以如果这是一个不合适的讨论话题,请告诉我。我对R(SAS转换!)也比较陌生,所以请容忍我 我试图用负二项分布的分支过程(或高尔顿-沃森过程)模拟R中的传染病爆发数据。下面给出了一个分支过程的示例,这是从中任意选取的。简言之,在传染病的背景下,每个分支过程从一个感染个体(第0代)开始,它们感染由一些后代分布定义的随机数量的继发病例(我使用带参数的负二项式后代(平均值=r0,离散度=k))。后代中的每个病例都会感染随机数目的病例,以此类推(i.i.d.) 我的主要目标是确定每个个体的次要病例数,表示为Z(即,在上图中,对于第0代[G(0)]:Z=2,在G(1)中,Z=2和Z=1,对于两个个体分别从左到右,依此类推) 我将数据布局想象成一个矩阵,类似于图中的前三代:在R中创建带有单个次要案例的分支过程,r,R,我是这个论坛的新手,所以如果这是一个不合适的讨论话题,请告诉我。我对R(SAS转换!)也比较陌生,所以请容忍我 我试图用负二项分布的分支过程(或高尔顿-沃森过程)模拟R中的传染病爆发数据。下面给出了一个分支过程的示例,这是从中任意选取的。简言之,在传染病的背景下,每个分支过程从一个感染个体(第0代)开始,它们感染由一些后代分布定义的随机数量的继发病例(我使用带参数的负二项式后代(平均值=r0,离散度=k))。后代中的每个病例都会感染随机数目的病例,以此类推(i.i.d.) 我的主要目标是确定每
#Example of data layout from first three generations in figure
x<-matrix(c(0,1,1,2,2,2,1,1,2,1,2,3,2,2,1,1,0,3),ncol = 3,nrow = 6)
colnames(x)<-c("Generation","Case Number","Secondary Cases (Z)")
#图中前三代的数据布局示例
xIt似乎更像是一个图形问题,特别是带有父节点和子节点的DAC(有向无环图)。我相信,igraph
可能有用,但我不是这方面的专家。如果没有这一点,我认为更好的结构(对于您的x
)应该是类似data.frame(id=…,parentid=…)
,它可以让您通过自我合并/加入来轻松确定个人的“次要案例”。谢谢!虽然我更关心的是数据表而不是实际的图形,但我将研究igraph和函数中的x
,你的问题主要是关于(1)生成一棵随机树,还是(2)取一棵树并计算代数和二次数?主要是后者-为每个个体计算二次数。根据你关于重新格式化数据帧的建议,我一直在编写代码来实现这一点,虽然这里显然太长了-我首先根据之前的次要案例数量定义了一个向量。-i、 e.如果有4个案例源自索引案例,则下一代将是一个向量,例如[0 2 0 1],每个数字代表个体的后续案例-i然后对该向量求和,并创建一个向量1[111],并对后续代重复,然后绑定它们allI在原始帖子中添加了代码-它很笨重而且不起作用,但这正是我目前所处的阶段。我感谢您对如何处理此问题的指导!这似乎更像是一个绘图问题,特别是带有父节点和子节点的DAC(有向无环图)。我相信,igraph
可能有用,但我不是这方面的专家。如果没有这一点,我认为更好的结构(对于您的x
)应该是类似data.frame(id=…,parentid=…)
,它可以让您通过自我合并/加入来轻松确定个人的“次要案例”。谢谢!虽然我更关心的是数据表而不是实际的图形,但我将研究igraph和函数中的x
,你的问题主要是关于(1)生成一棵随机树,还是(2)取一棵树并计算代数和二次数?主要是后者-为每个个体计算二次数。根据你关于重新格式化数据帧的建议,我一直在编写代码来实现这一点,虽然这里显然太长了-我首先根据之前的次要案例数量定义了一个向量。-i、 e.如果有4个案例源自索引案例,则下一代将是一个向量,例如[0 2 0 1],每个数字代表个体的后续案例-i然后对该向量求和,并创建一个向量1[111],并对后续代重复,然后绑定它们allI在原始帖子中添加了代码-它很笨重而且不起作用,但这正是我目前所处的阶段。我感谢您对如何处理此问题的指导!
#Single branching process
nbbp<-function(n, r0, k){
# initialize return vector
Z<-integer(n)
#Initiate branching process with 1 index case in generation 1
Z[1]<-1
for (i in seq_len(n)[-1]){
if(Z[i-1]>0) {
x<-rnbinom(Z[i-1], size=k, mu=r0)
Z[i] <- sum(x)
}
}
return(Z)
}
#Simulate multiple BP
nbbp.ind<-function(num_sim,n,r0,k){
x<-replicate(num_sim, nbbp(n,r0,k))
}
nbbp.individual<-function(r0,k,index=1,max_gen){
G1<-rnbinom(index,size=k,mu=r0) #Does the first iteration outside fo the while to avoid problems
cases<-G1 #initiates the number of cases in the first generation
sumCases<-G1 #since G1 will be a single integer, this is somewhat repeative but comes into play later in the loop
gen<-1 #initiates the generation for setting the max generations (to avoid hanging of near infinite loops)
while (sumCases>0 && (missing(max_gen)||(gen<max_gen))){
gen<-gen+1
individuals<-rep(1,sumCases) #This creates a single vector of 1's to simulate the single individuals in the generaiton (i.e.[1 1 1 1]
secondaryCases<-rnbinom(individuals,size=k,mu=r0) #This creates a vector of integers, each one corresponding to the
#number of secondary cases for each "individual" (i.e. [0 2 0 4])
sumCases<-sum(secondaryCases) #this sums the generation for purposes of the loop
cases<-c(cases, secondaryCases) #This appends the individuals for each generation
}
return(cases)
}