2015-11-26 3 views
1

Я использую r для анализа ненаправленной сети людей с этнической принадлежностью в качестве атрибутов. Я хочу создать таблицу связующих учетных записей или «матрицу предпочтений», квадратную матрицу, где значения этничности распределены по обоим измерениям, и каждая ячейка сообщает вам, сколько связей соответствует этому типу отношений. (поэтому из этого вы можете рассчитать вероятность того, что одна группа выбрасывает связи с другой группой, но я просто хочу использовать ее в качестве аргумента в функции предпочтения igraph). вот что я пробовал:Создать матрицу предпочтений в R?

# I create a variable for ethnicity by assigning the names of my vertices to their corresponding ethnicities 

    eth <- atts$Ethnicity[match(V(mahmudNet)$name,atts$Actor)] 

# I create an adjacency matrix from my network data 

    mat <- as.matrix(get.adjacency(mahmudNet)) 

# I create the dimensions for my preference matrix from the Ethnicity values 

    eth.value <- unique(sort(eth)) 

# I create an empty matrix using these dimensions 

eth.mat <- array(NA,dim=c(length(eth.value),length(eth.value))) 

# I create a function that will populate the empty cells of the matrix 

for (i in eth.value){ 
    for (j in eth.value){ 
    eth.mat[i,j] <- sum(mat[eth==i,eth==j]) 
    } 
} 

Моя проблема в конце, я думаю. Мне нужно выяснить выражение, которое сообщает R, как заполнять ячейки. выражение я ставлю, кажется, не работает, но я хочу, так что потенциально я мог бы пойти

a <- sum(mat[eth=="White", eth=="Black"]) 

А потом «а» вернет сумму всех ячеек в матрице смежности, которые соответствуют Уайту -Белые отношения.

Вот пример моих данных:

# data frame with Ethnicity attributes: 

        Actor Ethnicity 
1 Sultan Mahmud of Siak   2 
2   Daeng Kemboja   1 
3 Raja Kecik of Trengganu   1 
4    Raja Alam   2 
5    Tun Dalam   2 
6    Raja Haji   1 
7   The Suliwatang   1 
8   Punggawa Miskin   1 
9   Tengku Selangor   1 
10  Tengku Raja Said   1 
11   Datuk Bendahara   2 
12      VOC   3 
13  King of Selangor   1 
14  Dutch at Batavia   3 
15   Punggawa Tua   2 
16 Raja Tua Encik Andak   1 
17  Raja Indera Bungsu   2 
18   Sultan of Jambi   2 
19   David Boelen   3 
20  Datuk Temenggong   2 
21  Punggawa Opu Nasti   1 

# adjacency matrix with relations 

        Daeng Kemboja Punggawa Opu Nasti Raja Haji Daeng Cellak 
Daeng Kemboja     0     1   1   1 
Punggawa Opu Nasti    1     0   1   0 
Raja Haji      1     1   0   0 
Daeng Cellak     1     0   0   0 
Daeng Kecik     1     0   0   0 
        Daeng Kecik 
Daeng Kemboja    1 
Punggawa Opu Nasti   0 
Raja Haji     0 
Daeng Cellak     0 
Daeng Kecik     0 
+2

Какой пакет '' get.adjacency' и V'? Или это ваши собственные функции. – C8H10N4O2

+0

Это все в igraph. V (mahudnet) $ name - это переменная, относящаяся к именам вершин в моем сетевом объекте. – Audrey

ответ

2

Это простая работа для table, когда у вас есть данные в нужной форме.

Первый образец набора данных:

# fake ethnicity data by actor 
actor_eth <- data.frame(actor = letters[1:10], 
         eth = sample(1:3, 10, replace=T)) 

# fake adjacency matrix 
adj_mat <- matrix(rbinom(100, 1, .5), ncol=10) 
dimnames(adj_mat) <- list(letters[1:10], letters[1:10]) 
# blank out lower triangle & diagonal, 
# so random data is not asymetric & no self-ties 
adj_mat[lower.tri(adj_mat)] <- NA 
diag(adj_mat) <- NA 

Вот наша фальшивка матрица смежности:

a b c d e f g h i j 
a NA 1 1 1 0 0 1 1 0 1 
b NA NA 0 1 0 1 0 0 1 0 
c NA NA NA 1 1 0 0 1 0 0 
d NA NA NA NA 1 0 0 1 1 0 
e NA NA NA NA NA 0 0 1 0 1 
f NA NA NA NA NA NA 1 1 0 1 
g NA NA NA NA NA NA NA 1 1 0 
h NA NA NA NA NA NA NA NA 0 0 
i NA NA NA NA NA NA NA NA NA 1 
j NA NA NA NA NA NA NA NA NA NA 

Вот наш поддельный ETH стол:

actor eth 
1  a 3 
2  b 3 
3  c 3 
4  d 2 
5  e 1 
6  f 3 
7  g 3 
8  h 3 
9  i 1 
10  j 2 

Так что вы хотите сделать, это 1) поместите это в длинный формат, так что у вас есть куча строк с исходным актером и целевым актером, каждый из которых представляет собой галстук. Затем 2) замените имя актера на этническую принадлежность, поэтому у вас есть связи с исходной/целевой этнической принадлежностью. Затем 3) вы можете просто использовать table, чтобы сделать кросс-вкладку.

# use `melt` to put this in long form, omitting rows showing "non connections" 
library(reshape2) 
actor_ties <- subset(melt(adj_mat), value==1) 

# now replace the actor names with their ethnicities to get create a data.frame 
# of ties by ethnicty 
eth_ties <- 
    data.frame(source_eth = with(actor_eth, eth[match(actor_ties$Var1, actor)]), 
      target_eth = with(actor_eth, eth[match(actor_ties$Var2, actor)])) 

# now here's your cross tab 
table(eth_ties) 

Результат:

  target_eth 
source_eth 1 2 3 
     1 0 2 1 
     2 2 0 1 
     3 3 5 9 
+0

Большое вам спасибо, это действительно приближается к тому, что я хочу, но я не понимаю, откуда приходит информация из матрицы смежности. Не все привязаны ко всем; где вы указываете, к какому «source_id» подключен к которому «target_id»? – Audrey

+0

Это в data.frame называется 'ties'. Вы можете увидеть в примере 5 строк, человек 1 привязан к человеку 9, 6-8, 8, 5, 9, 8 и 1 к 5. Очевидно, что это просто случайные фиктивные данные. Если вы не можете обобщить это на свои данные и вам нужна более конкретная помощь, вы должны опубликовать образец своих фактических данных. – arvi1000

+0

Хорошо, я разместил образец моих данных. Вероятно, это больше для иллюстрации, потому что в матрице и в фрейме данных будет только то же количество участников в них, если бы я дал вам все это ... – Audrey

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