当前位置: 首页 > 知识库问答 >
问题:

在R?中多次生成节点间概率随机边

姬自强
2023-03-14

所以我想生成一个有3个节点的随机网络。边缘必须在两个节点之间以特定的概率或强度随机分布。

选择具有以下概率的节点:节点1:0.6节点2:0.3节点3:0.1

我想多次这样做,因为这是时态数据的一部分。因此,在每个时间戳一个连接。

我用igraph在R中做这件事。但是急诊室模型做不到。

知道我该怎么做吗?

编辑:边是定向的。(注意:我是一名生物专业的学生,不是一名与网络打交道的铁杆人士。所以任何指导和建议都会很有帮助。)

共有1个答案

微生昌胤
2023-03-14

你想要的似乎是不可能的。有三种可能的边:1-2、1-3和2-3。设p_ij表示选择边i-j的概率。请注意,给定节点出现在随机选择的边上的概率是涉及该节点的两个边概率之和,因此。

p(1) = p_12 + p_13

您似乎希望p_ij满足:

p_12 + p_13 = 0.6
p_12 + p_23 = 0.3
p_13 + p_23 = 0.1
p_12 + p_13 + p_23 = 1

进一步的限制是每个pij

这根本不可能,前三个方程产生p_12=0.4p_13=0.2p_23=-0.1,这违反了第四个方程和非负性约束。

如果这个论点并不意味着你想要的是不可能的,请更清楚地解释一下你想做什么。

编辑:如果你想模拟节点之间的移动(根据你的评论),你可以这样做:

#the following function takes a vector, nodes of
#populations and picks a random move of an individual
#from one node to another. Chosen source node is
#is picked with probability which is proportional
#to the population. Return value is a vector of
#the form c(from,to) 

move <- function(nodes){
  total.pop <- sum(nodes)
  n <- length(nodes)
  from <- sample(1:n,1,prob = nodes/total.pop)
  to <- sample((1:n)[-from],1)
  c(from,to)
}

#The following function takes an initial population
#distribution and simulates n moves according to the above
#it returns a dataframe with one row per step

moves <- function(nodes,steps){
  n <- length(nodes)
  current <- nodes #current nodes
  A <- matrix(0,steps+1,n+3)
  A[1,] <- c(0,c(NA,NA),nodes)
  for(i in 1:steps){
    v <- move(current)
    current[v[1]] <- current[v[1]] - 1
    current[v[2]] <- current[v[2]] + 1
    A[i+1,] <- c(i,v,current)
  }
  df <- data.frame(A)
  names(df) <- c("Step","From","To",paste("Node",1:n,sep = ""))
  df
}

例如:

> sim <- moves(c(60,30,10),1000)
> plot(sim$Step,sim$Node1,type = "l",ylim = c(0,100),xlab = "Time Step", ylab = "populations")
> points(sim$Step,sim$Node2,type = "l",col = "blue")
> points(sim$Step,sim$Node3,type = "l",col = "red")

输出:

 类似资料:
  • 我想知道(例如在Java中)在特定范围内生成随机数的最佳方法是什么,其中每个数都有一定的发生概率? e. g. 从[1;3]中生成概率如下的随机整数: P(1)=0.2 P(2)=0.3 P(3)=0.5 现在,我正在考虑在[0;100]范围内生成一个随机整数的方法,并执行以下操作: 如果在[0; 20]以内--

  • 问题内容: 我有一个问题,我想使用概率分布生成一组1到5之间的随机整数值。 泊松和逆伽玛是两个分布,它们显示了我所追求的特征(多数情况下为平均值,较少的较高数)。 我正在使用Apache Commons Math,但不确定如何使用可用的分布来生成所需的数字。 问题答案: 从问题描述中,听起来好像您实际上想要从离散的概率分布中生成样本,并且您可以将其用于此目的。为每个整数选择适当的概率,也许类似以下

  • 问题内容: 我想知道在特定范围内生成随机数的最佳方法(例如在Java中)是什么,而每个范围内的每个数字都有一定的发生概率? 例如 从[1; 3]内产生随机整数,并具有以下概率: P(1)= 0.2 P(2)= 0.3 P(3)= 0.5 现在,我正在考虑在[0; 100]内生成随机整数并执行以下操作的方法: 如果它在[0; 20]之内->我得到我的随机数1。 如果它在[21; 50]之内->我得到

  • 我们了解了“样本空间”,“事件”,“概率”。样本空间中包含了一次实验所有可能的结果,事件是样本空间的一个子集,每个事件可以有一个发生的概率。概率是集合的一个“测度”。 这一讲,我们将讨论随机变量。随机变量(random variable)的本质是一个函数,是从样本空间的子集到实数的映射,将事件转换成一个数值。根据样本空间中的元素不同(即不同的实验结果),随机变量的值也将随机产生。可以说,随机变量是

  • 问题内容: 我想生成一个随机时间戳,并向其添加一个随机增量,以生成第二个时间戳。那可能吗? 如果我传递随机的long值来创建时间戳,并且我想随机生成该long值,那么生成该值以给出2012年的时间戳的约束是什么? 问题答案: 您需要将随机数缩放到特定年份的范围,然后将年份的开始添加为偏移量。一年中的毫秒数从一年到另一年(le年有额外的一天,某些年份有leap分钟,依此类推),因此您可以按以下步骤确

  • 我想为给定数量的节点和边生成一个随机图。当我运行它时,它会返回一个包含所有零的edgelist(例如,如果我用五个节点和边运行它,它会返回五对零作为edgelist)。这部分代码是否有问题导致了这种情况?