R SNA: создание матрицы смежности, содержащей все акторы, но только значения подмножества

Моя проблема заключается в следующем:

Я использую пакет R SNA для анализа социальных сетей. Допустим, моя отправная точка - это список ребер со следующими характеристиками. Каждая строка содержит название фирмы, идентификатор проекта, в котором они участвуют, и дополнительные характеристики, скажем, год проекта. Фирмы могут быть в нескольких проектах, и один проект может состоять из сотрудничества более чем одной фирмы. Пример:

Name   Project   Year
AA     1         2003
AB     1         2003
AB     2         2003
AB     3         2004
AC     2         2003
AC     4         2005

Для сетевого анализа мне нужна матрица смежности со всеми фирмами в виде заголовка строки и столбца, которую я строю следующим образом:

grants.edgelist <- read.csv("00-composed.csv", header = TRUE, sep = ";", quote="\"", dec=",", fill = TRUE, comment.char="")

grants.2mode <-  table(grants.edgelist)   # cross tabulate -> 2-mode sociomatrix

grants.adj <- grants.2mode%*%t(grants.2mode)     # Adjacency matrix as product of the 2-mode sociomatrix`

Теперь моя проблема: я хочу запустить регрессию netlm на матрице смежности, где я проверяю, как сеть в один данный год объясняет сеть в следующем году. Тем не менее, поэтому я хотел поместить grants.edgelist в набор только для (скажем, 2003 и 2005). However, I figured out that not all firms are in projects every year, and therefore the corresponding adjacency matrix has different rows and columns.

Now my question: How could I obtain a adjacency matrix containing all firms in row and column header, but their intersection set on zero expect of the year I want to observe. I hope it is clear what I mean.

Заранее большое спасибо. This problem is driving me crazy today!

С наилучшими пожеланиями

Даниил

1 ответ

Предполагая, что существует вероятность того, что одна и та же фирма будет работать над одним и тем же проектом в течение нескольких лет (если нет, то существуют более простые решения). Один из способов сделать это - создать объект networkDynamic, а затем извлечь нужные вам годы и передать их в netlm,

library(networkDynamic)

# construct example dataset
firmProj <- matrix(
                    c('AA', 1,  2003,
                      'AB', 1, 2003,
                      'AB', 2, 2003,
                      'AB', 3, 2004,
                      'AC', 2, 2003,
                      'AC', 4, 2005),
                       ncol=3,byrow=TRUE)
colnames(firmProj)<-c('Name',   'Project',   'Year')

# make network encompassing all edges
baseNet<-network(firmProj[,1:2])

# get the ids/names of the vertices
ids<-network.vertex.names(baseNet)

# convert original data to a timed edgelist
tel<-cbind(as.numeric(firmProj[,3]),   # convert years to numeric start time
           as.numeric(firmProj[,3])+1, # convert years to numeric end  time
           match(firmProj[,1],ids),    # match label to network id
           match(firmProj[,2],ids))    # match label to network id

# convert to a networkDynamic object
dynFirmProj<-networkDynamic(baseNet, edge.spells = tel)

# bin static networks from the dynamic one, and convert them into list of adjacency matrices
lapply(
       get.networks(dynFirmProj,start=2003, end = 2006, time.increment = 1),
       as.matrix)

[[1]]
   1 2 3 4 AA AB AC
1  0 0 0 0  0  0  0
2  0 0 0 0  0  0  0
3  0 0 0 0  0  0  0
4  0 0 0 0  0  0  0
AA 1 0 0 0  0  0  0
AB 1 1 0 0  0  0  0
AC 0 1 0 0  0  0  0

[[2]]
   1 2 3 4 AA AB AC
1  0 0 0 0  0  0  0
2  0 0 0 0  0  0  0
3  0 0 0 0  0  0  0
4  0 0 0 0  0  0  0
AA 0 0 0 0  0  0  0
AB 0 0 1 0  0  0  0
AC 0 0 0 0  0  0  0

[[3]]
   1 2 3 4 AA AB AC
1  0 0 0 0  0  0  0
2  0 0 0 0  0  0  0
3  0 0 0 0  0  0  0
4  0 0 0 0  0  0  0
AA 0 0 0 0  0  0  0
AB 0 0 0 0  0  0  0
AC 0 0 0 1  0  0  0

Однако я не уверен netlm будет лучшим способом взглянуть на это, так как дихотомические данные для зависимой переменной "… настоятельно не рекомендуются из-за допущений анализа". Но, возможно, я не совсем понимаю ваш вопрос.

Другие вопросы по тегам