2014-10-20 3 views
2

Я пытаюсь преобразовать данные поперечного сечения в матрицу смежности, так как я хочу проанализировать, как часто некоторые переменные присутствуют вместе с анализом социальной сети. В случае, если эмпирические примеры помогут с логикой, это в основном аналогично представлению четырех человек с выбором из трех объектов; они могут выбирать от 0 до 3 объектов. Я хотел бы проанализировать, как обычно разные объекты были выбраны вместе и визуализировать это как сеть предпочтений.Преобразование данных поперечного сечения в матрицу смежности в R

Данные установки в качестве данных поперечного сечения, ниже:

ID1 <- c(1,0,0) 
ID2 <- c(1,0,1) 
ID3 <- c(1,1,1) 
ID4 <- c(0,0,0) 
IDs <- c("1","2","3","4") 
df <- data.frame(rbind(ID1, ID2, ID3, ID4)) 
df <- cbind(IDs, df) 
colnames(df) <- c("ID", "Var1", "Var2", "Var3") 

Я хотел бы создать взвешенную матрицу смежности для Переменная1, Var2 и var3, с каждой ячейкой, содержащей общее количество раз эти две переменные встречаются вместе между наблюдениями.

Итак, основная процедура, о которой я думал, - создать отдельную матрицу для каждой строки (каждый идентификационный номер) с 1 или 0 для каждой ячейки, указывающей, имеются ли обе переменные для идентификатора. А затем добавьте эти матрицы вместе, поэтому итоговая матрица дает общее количество совместных выступлений.

Я оглядывался и не совсем понял. Я думал об использовании внешнего, но ему нужно будет работать для каждого столбца в последовательности. Этот ответ был довольно близким, но я не был точно уверен, как они объединяют ценности. Я закончил список матриц, но значения не соответствовали исходным данным - Convert categorical data in data frame to weighted adjacency matrix. И этот ответ тоже был близок, хотя, похоже, у него был другой тип данных. Это дало мне матрицу смежности на основе IDs- http://r.789695.n4.nabble.com/Conversion-to-Adjacency-Matrix-td794102.html

Здесь очень грязный код вручную создать матрицу для одного наблюдения, только так вы получите ощущение, что я иду (с использованием вектора, представляющего только первое наблюдение ID)

ID1 <- c(1,0,0) 

var1 <- ID1[[1]] 
var2 <- ID1[[2]] 
var3 <- ID1[[3]] 
onetwo <- var1 * var2 
onethree <- var1 * var3 
twothree <- var2 * var3 
oneone <- var1 * var1 
twotwo <- var2 * var2 
threethree <- var3 * var3 
rows1 <- rbind(oneone, onetwo, onethree) 
rows2 <- rbind(onetwo, twotwo, twothree) 
rows3 <- rbind(onethree, twothree, threethree) 
df2 <- cbind(rows1, rows2, rows3) 

Это, очевидно, не является идеальным, мой фактический набор данных имеет 198 наблюдений и 33 переменных, так что даже с сквозными или использования применяемых функций было бы очень неэффективно.

Я не могу сказать, делаю ли я это более сложным, чем это должно быть, или если я пытаюсь заставить свои данные делать то, что он не должен был делать. Но если кто-то столкнулся с этой задачей раньше, пожалуйста, дайте мне знать. Есть ли способ создать желаемую матрицу смежности напрямую? Должен ли я перенести это в список краев первым, и есть ли хороший способ сделать это? Есть ли код, который сделает первый шаг (создание матрицы для каждой строки кадра данных) более эффективным?

Спасибо за вашу помощь,

ответ

1

Я не уверен, если я понимаю этот вопрос, но это то, что вы хотите?

nc=33 
nr=198 
m3<-matrix(sample(0:1,nc*nr,replace=TRUE),nrow=nr) 
df3<-data.frame(m3) 
m3b <-matrix(0,nrow=nc,ncol=nc) 
for(i in seq(1,nc)) { 
    for (j in seq(1,nc)) { 
    t3<-table(df3[,i],df3[,j]) 
    m3b[i,j] = t3[2,2] # t3[2,2] contains the count of df3[,i] = df3[,j] = 1 
    # or 
    # t3 = sum(df3[,i]==df3[,j] & df3[,i] == 1) 
    # m3b[i,j] = t3 
    } 
} 

или, если вы хотите сумму продукта, что дает тот же результат, если все 1 или 0

m3c <-matrix(0,nrow=nc,ncol=nc) 
for(i in seq(1,nc)) { 
    for (j in seq(1,nc)) { 
    sv=0 
    for (k in seq(1,nr)) { 
     vi = df3[k,i] 
     vj = df3[k,j] 
     sv=sv+vi*vj  
    } 
    m3c[i,j] = sv 
    } 
} 
+0

, что работал отлично, спасибо. Первый вариант дал мне «индекс ошибок за пределами» для команды t3 [2,2] с использованием моих данных, хотя и не использовал ваши смоделированные данные. Но вторая версия работала (m3c), и мои данные дихотомичны, так что это здорово. Большое спасибо за вашу помощь, – PSR

+0

@ user3830805 Если это ответ на вопрос, вы должны проверить галочку, чтобы другие не отвечали. Если ответ был полезен, вы можете нажать стрелку вверх. –

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