Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中创建带有单个次要案例的分支过程_R - Fatal编程技术网

在R中创建带有单个次要案例的分支过程

在R中创建带有单个次要案例的分支过程,r,R,我是这个论坛的新手,所以如果这是一个不合适的讨论话题,请告诉我。我对R(SAS转换!)也比较陌生,所以请容忍我 我试图用负二项分布的分支过程(或高尔顿-沃森过程)模拟R中的传染病爆发数据。下面给出了一个分支过程的示例,这是从中任意选取的。简言之,在传染病的背景下,每个分支过程从一个感染个体(第0代)开始,它们感染由一些后代分布定义的随机数量的继发病例(我使用带参数的负二项式后代(平均值=r0,离散度=k))。后代中的每个病例都会感染随机数目的病例,以此类推(i.i.d.) 我的主要目标是确定每

我是这个论坛的新手,所以如果这是一个不合适的讨论话题,请告诉我。我对R(SAS转换!)也比较陌生,所以请容忍我

我试图用负二项分布的分支过程(或高尔顿-沃森过程)模拟R中的传染病爆发数据。下面给出了一个分支过程的示例,这是从中任意选取的。简言之,在传染病的背景下,每个分支过程从一个感染个体(第0代)开始,它们感染由一些后代分布定义的随机数量的继发病例(我使用带参数的负二项式后代(平均值=r0,离散度=k))。后代中的每个病例都会感染随机数目的病例,以此类推(i.i.d.)

我的主要目标是确定每个个体的次要病例数,表示为Z(即,在上图中,对于第0代[G(0)]:Z=2,在G(1)中,Z=2和Z=1,对于两个个体分别从左到右,依此类推)

我将数据布局想象成一个矩阵,类似于图中的前三代:

#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)
}