2

R プログラミングを使用して、複雑なネットワークで影響力のあるノードを見つけることに取り組んでいます。ノードがグラフ内に持つ隣接ノードの数を意味する次数中心性を使用したいと考えています。グラフと各ノードの次数中心性があります。ここで、各ノードからウイルスを拡散し始めたときに、指定された時間内に感染するノードの数を知りたいと考えています。私の研究によると、「igraph」パッケージで見つけたSIR(感受性、感染、回復)流行モデルを使用する必要がありますが、問題は開始ノードを指定できないことです。この関数は、SIR 方程式に基づいて機能するようです。

s'= -(beta)SI
I' = (beta)SI - (gamma)I
R' = (gamma)I

ここで、ベータは感染パラメータ、ガンマは回復パラメータです。igraph SIR コードは次のとおりです。

function (graph, beta, gamma, no.sim = 100) 
{
if (!is_igraph(graph)) {
    stop("Not a graph object")
}
beta <- as.numeric(beta)
gamma <- as.numeric(gamma)
no.sim <- as.integer(no.sim)
on.exit(.Call("R_igraph_finalizer", PACKAGE = "igraph"))
res <- .Call("R_igraph_sir", graph, beta, gamma, no.sim, 
    PACKAGE = "igraph")
class(res) <- "sir"
res
}

It seems that most of the work is being done in "R_igraph_sir" but I cant find such a function in that package. Is there any way to set the starting node?

4

1 に答える 1

2

既存の R コードにモンキーパッチを適用して、最初に感染したノードを設定できる SIR モデルが必要なようです。igraphR パッケージは C コードからコンパイルされているため、プログラミングの経験によっては難しいかもしれません。一般的には、パッケージを更新した瞬間にコードが失われるため、モンキーパッチは推奨されません。

igraph代わりに、パッケージを使用して比較的簡単にこれを自分で実装できます。以下は、R に簡単に移植できる未テストの Python 実装です。

最初のステップでは、感染したノードに隣接するグラフ内の任意のノードに次の確率で感染します。beta

感染段階の後、感染したノードは、次の確率でグラフから削除できます。gamma

infected_nodes指定された数のタイムステップの後、影響を受けるノードの数が配列のサイズとしてわかります。これは削除されたノードをカウントしないため、シミュレーション全体で感染した総数が必要な場合は、ノードに感染するたびに増加するカウンターを入れます

infected_nodes = []
# Set the infection rate
beta = 0.1
# Set the removal rate
gamma = 0.1
# Set how many timesteps you want to pass through
n_timesteps = 100
# Start from the node you have chosen using edge centrality
infected_nodes.append(chosen_node)
for _ in n_timesteps:
    # Infection stage
    for node in infected_nodes:
        for neighbor in igraph.neighborhood(graph, node):
            # random.random simply returns a number between [0,1)
            if random.random() < beta:
                infected_nodes.append(neighbor)
    # Removal stage
    infected_survivors = []
    for node in infected_nodes:
        if random.random() < gamma:
            graph = igraph.delete_vertices(graph, node)
        else:
            infected_survivors.append(node)
    infected_nodes = infected_survivors

いくつかのアベルダベイ:

  • これは、すべてのノードが各タイムステップですべての近隣ノードを訪問することを前提としています。各ノードがターンごとにネイバーに感染できるようにするだけの場合は、すべてのノードを反復処理するのではなく、ネイバーのランダムなnサイズのサンプルを取得する必要があります。n
  • 除去段階では、新たに感染したノードを除去することができます。つまり、ノードが隣接ノードに感染する機会がない可能性があります。これが現実的でない場合は、新たに感染したノードを別のアレイに保存し、感染段階の開始時にそれらを感染したノードに追加する必要があります。
  • これは、R パッケージによって提供される C 実装よりも明らかに遅くなります。
于 2016-07-28T07:13:28.847 に答える