Значения собственных векторов для разных периодов времени одной и той же сети (igraph в R) - PullRequest
0 голосов
/ 13 декабря 2018

Заполните R новобранец здесь, поэтому, пожалуйста, потерпите меня!

У меня есть данные за год для торговли между странами за определенный период времени.Я пытаюсь вычислить значения центральности собственных векторов для каждой страны в каждом отдельном году в период 1946-2014 гг.Во-вторых, я хотел бы аккуратно упаковать все эти собственные значения (с метками и годами) в кадр данных, который можно экспортировать в CSV.

Возьмем ребра следующего примера:

links <- structure(list(ccode1 = c(2L, 3L, 4L, 5L, 2L, 3L, 4L, 5L, 2L, 
3L, 4L, 5L), ccode2 = c(5L, 4L, 3L, 2L, 5L, 4L, 3L, 2L, 
5L, 4L, 3L, 2L), year = c(1960, 1960, 1960, 1960, 1961, 1961, 1961, 1961, 1962, 1962, 1962, 1962), weight = c(1347.34, 778.42999, 
866.85999, 1014.14, 895.46002, 1082.0699, 1584.7, 1193.37, 1355.3101, 
1348.75, 3653.54, 616.98999)), row.names = c(NA, 12L), class = "data.frame")

Сеть будет построена следующим образом:

network <- graph_from_data_frame(links, directed = FALSE, vertices = NULL)

И собственные значения будут рассчитаны следующим образом:

trade.eigen <- eigen_centrality(network, directed = FALSE)

1.Как я могу автоматизировать расчет собственных значений для каждой страны в каждом году?

2.И как мне объединить все эти значения вместе с метками страны и годами в одном кадре данных?

1 Ответ

0 голосов
/ 13 декабря 2018

Спасибо за предоставленный легко воспроизводимый пример.Если я правильно понимаю вашу проблему, все, что вам нужно сделать, это:

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

Семейство пакетов tidyverse имеетмножество полезных функций, чтобы сделать это легко.Используйте map для итерации, используйте enframe , чтобы изменить форматы с значение ключа на формат данных , затем используйте unnest навести порядок.

# install.packages('tidyverse')
library(tidyverse)


#let's get all unique values for year
#we can do this by pulling the edge attribute
#"year" frome the graph "network"
years <- E(network)$year %>%
  unique


#now we want to use purrr's map to iterate through all the years
#the goal is to only keep edges from a year we are interested in
#"map" returns a list, and if we use the function "setNames", then
#each item in the list will be named after the object we are iterating
eigen_by_year <- purrr::map(setNames(years, years), function(yr){
  #here we filter away all edges that aren't from the year we are interested
  network_filtered = network - E(network)[year != yr]

  #we now calculate the eigen values for the filtered network
  eigen_values <- eigen_centrality(network_filtered, directed = F)$vector

  #"eigen_values" is a named vector, let's convert this named vector
  #into a data frame with the name column being the vertex name
  #and the value column being the eigen value
  tibble::enframe(eigen_values)
})

#The result is a list where the item names are the years
#and they contain a data frame of the eigen values associated
#with their years
eigen_by_year

#let's use enframe one more time so that the name of the list items
#are now their own "name" column and the nested data rames are
#in the "value" column" we will need to use unnest to flatten the dataframe
eigen_data_frame <- eigen_by_year %>%
  tibble::enframe() %>%
  tidyr::unnest()

eigen_data_frame

Надеюсь, это поможет.

...