2014-01-10 2 views
0

Я создал неориентированную случайную сеть (Erdos-Renyi) в R, используя библиотеку igraph. Он состоит из 100 узлов и вероятность p, что ребро существует между двумя узлами, равно 0,2.Разделение случайной сети на две сети в R

Это мой код, чтобы создать случайную сеть:

original <- erdos.renyi.game(100, 0.2, type = c("gnp", "gnm"), directed = FALSE, 
    loops = FALSE) 

Так оригинальная сеть может выглядеть примерно так:

 O 
     |     Please note: O represent nodes, and the lines 
     |         represent the edges between the nodes 
O-----O-----O 
|  | \ 
|  | \ 
O-----O O 

Мне нужно разделить эту случайную сеть на две сети (так называемые net1 и net2), так что, если выбрано случайное число «1», граница между двумя узлами из исходной сети будет существовать между теми же двумя узлами net1 (или если выбрано случайное число «2», край будет существуют в net2, снова между одними и теми же двумя узлами).

Тогда net1 и NET2 может выглядеть примерно так, в зависимости от случайных чисел («1» и «2») для их краев:

 O     O 
          | 
          | 
O-----O  O  O  O-----O 
     | \   | 
     | \   | 
O  O O   O-----O O 
    net1    net2 

Так что если net1 имеет ребро между двумя узлами, которые были первоначально в исходной сети, net2 не имел бы этого края между одними и теми же двумя узлами (и тот же, если край находится в net2, он также не должен быть в net1).

Я не уверен, как перейти к разделению исходной сети в две сети и созданию ребер между одними и теми же узлами двух сетей в качестве исходной сети в соответствии со случайным числом ('1' или ' 2 ').

Извините, если это немного запутанно, это трудно объяснить.

Любая помощь будет высоко оценена. Спасибо заранее.

+0

Вы можете лучше объяснить, что вы хотите, с воспроизводимым примером. Покажите нам сеть и как она может выглядеть, если она будет разделена. –

ответ

2

В течение некоторого случайного igraph сетевого объекта a

# what is the order of a? 
n <- length(V(a)) 

# random network 
# we're only interested in this for that fact that it provides a 
# random symmetric matrix with approx. half of its edges present 
ran <- erdos.renyi.game(n, .5, type="gnp", directed=F) 

# network 1 (as an igraph graph object) 
g1 <- graph.adjacency(a[,] * ran[,]) 

# network 2 (also as an igraph graph object) 
g2 <- graph.adjacency(a[,] * !ran[,]) 

Полученные объекты будут igraph график представления разделенной сети. Вы можете легко преобразовать их в любую форму, в которой вы нуждаетесь. Без graph.adjacency() эти последние два вычисления приводят, например, к разреженным матричным представлениям.

Существенная логика заключается в том, что случайная матрица (отличная от случайной сети) 0s и 1s (приблизительно 50% каждого) умножается на случайную сеть, чтобы привести к одной сети в среднем, случайный выбор половины ребер в исходной случайной сети. Затем дополнение случайной матрицы умножается на случайную сеть, что приводит к второй сети с остальными связями исходной сети.

Если вы должны были взять два результата в матричном формате и добавить их поэтапно, у вас будет оригинальная сеть снова (в матричном формате).

+0

Как бы я мог изменить код, если бы захотел изменить его, чтобы, если вероятность меньше или равна 0,1, край идет в net1, а если вероятность меньше или равна 0,9, то она идет в net2 ? И если вероятность выходит за пределы этого диапазона (т. Е. Больше 0,9), то это будет 50-50 случай, если край идет в net1 или net2? – LoneWolf

+1

Могу ли я сделать это, создав случайное число между 0-1 и если случайное число находится между 0-0.1 (0.1 исключение) край идет в net1, а если случайное число находится между 0,1-1 (0,1 включительно), то край идет в net2? Я генерирую случайное число, подобное этому: 'randnum <- runif (1, min = 0, max = 1)', а затем использовать цикл for внутри цикла while: 'while (есть края для просмотра) {if (randnum> = 0 && randnum <0,1) {положить ребро в net1} else if (randnum> = 0.1 && randnum <1) {положить край в net2}} '. Я просто не уверен, как написать код, чтобы просмотреть края и поместить ребро в net1 или net2. – LoneWolf

+0

@LoneWolf Вы можете установить второй аргумент 'erdos.renyi.game()' (установленный в '.5' в приведенном выше примере, таким образом создавая разделение 50/50), что бы вы ни хотели. Если вы используете '0,1', то с вероятностью 10% любая привязка в исходной сети закончится в' g1', иначе она закончится в 'g2'. – ndoogan

Смежные вопросы