Importando dados do UCINET
Em meu último post, trabalhamos a importação de dados a partir do software Pajek, ferramenta gratuita e disponível para usuários do sistema Windows. Para importamos dados do UCINET, outro software bastante comum para ARS, podemos gerar um arquivo .txt com o menu Data - Export - Raw Data tomando o cuidado de deixar as opções Field width = VARIABLE e a opção Separate numbers with = others (;) para estabelecer ponto-e-vírgula como separador. No R, a rotina consiste de ler os dados do arquivo .txt, transformá-los em um objeto de classe matrix e separar as redes (temos que lidar com cada uma em separado diferente do UCINET) para começar as análises. Podemos importar os dados com os comandos
rede <- read.csv2("C:/Users/.../Krack-High-Tec.txt", header = T, stringsAsFactors = F)
rede <- as.matrix(rede)
krack_advice <- rede[1:21,]
krack_friendship <- rede[22:42,]
krack_reports_to <- rede[43:63,]
Agora, transformamos as matrizes em objetos igraph.
library(igraph)
krack_advice <- graph_from_adjacency_matrix(krack_advice)
krack_friendship <- graph_from_adjacency_matrix(krack_friendship)
krack_reports_to <- graph_from_adjacency_matrix(krack_reports_to)
Para plotar as três ao mesmo tempo:
par(mfrow=c(1,3))
plot(krack_advice, vertex.label.cex=.8, vertex.label.color="black", vertex.color="red", edge.arrow.size=0.2, main="Krackhardt ADVICE")
plot(krack_friendship, vertex.label.cex=.8, vertex.label.color="black", vertex.color="lightblue", edge.arrow.size=0.2, main="Krackhardt FRIENDSHIP")
plot(krack_reports_to, vertex.label.cex=.8, vertex.label.color="black", vertex.color="yellow", edge.arrow.size=0.2, main="Krackhardt REPORTS TO")
Para importar os atributos presentes no arquivo High-Tec-Attributes, faça o mesmo processo para exportar os dados para uma Raw Matrix no UCINET e no R faça
atributos <- read.csv2("C:/Users/.../High-Tec_Attributes.txt", header = T, stringsAsFactors = F)
Para colocamos os vetores de atributos junto aos objetos igraph fazemos
V(krack_advice)$age <- atributos$AGE
V(krack_advice)$tenure <- atributos$TENURE
V(krack_advice)$level <- atributos$LEVEL
V(krack_advice)$dept <- atributos$DEPT
krack_advice
## IGRAPH DN-- 21 190 --
## + attr: name (v/c), age (v/n), tenure (v/n), level (v/n), dept
## | (v/n)
## + edges (vertex names):
## [1] X1->X2 X1->X4 X1->X8 X1->X16 X1->X18 X1->X21 X2->X6 X2->X7
## [9] X2->X21 X3->X1 X3->X2 X3->X4 X3->X6 X3->X7 X3->X8 X3->X9
## [17] X3->X10 X3->X11 X3->X12 X3->X14 X3->X17 X3->X18 X3->X20 X3->X21
## [25] X4->X1 X4->X2 X4->X6 X4->X8 X4->X10 X4->X11 X4->X12 X4->X16
## [33] X4->X17 X4->X18 X4->X20 X4->X21 X5->X1 X5->X2 X5->X6 X5->X7
## [41] X5->X8 X5->X10 X5->X11 X5->X13 X5->X14 X5->X16 X5->X17 X5->X18
## [49] X5->X19 X5->X20 X5->X21 X6->X21 X7->X2 X7->X6 X7->X11 X7->X12
## + ... omitted several edges
No post 01 já mostramos como podemos usar os atributos para plotar as redes. Recomendo que experimentemos várias combinações de acordo com o que pretendemos investigar.
Visualizações interativas com tkplot
Podemos gerar visualizações no R com o comando tkplot:
tkplot(krack_advice, vertex.label.cex=.8, vertex.label.color="black", vertex.color="red", edge.arrow.size=0.2)
## [1] 1
Essa visualização nos permite editar de forma interativa alguns elementos do grafo (excetuando-se tamanho e cor dos vértices e laços que devem ser preestabelecidos). Se conseguirmos obter um resultado visual satisfatório e elegante, é bom que façamos a extração das coordenadas para exportamos para outros softwares, caso seja necessário. Para isso, usamos o comando tk_coords() com o primeiro parâmetro sendo o id do grafo gerado no output do comando anterior.
coordenadas <- tk_coords(1, norm=T)
A partir dessas coordenadas, podemos ainda gerar outro gráfico pelo método convencional mas com a localização dos vértices que gostamos.
plot(krack_advice, vertex.label.cex=.8, vertex.label.color="black", vertex.color="red", edge.arrow.size=0.2, layout=coordenadas, main="Krackhardt ADVICE")
Visualizações em 3D
O R gera algumas visualizações em 3D bastante elegantes. Para um grafo 3D, faça
rglplot(krack_advice, vertex.label.cex=.8, vertex.label.color="black", vertex.color="red", edge.arrow.size=0.2, layout=layout_with_kk)
Para salvar o grafo 3D em uma imagem, use
snapshot3d("rede3d.png", "png", top=F)
Aqui está um exemplo
Outra opção interessante é trabalhar com o pacote networkD3. Para isso, faça
library(networkD3)
krack3d <- igraph_to_networkD3(krack_advice)
simpleNetwork(krack3d$links, Source="source", Target="target", fontSize = 10)
Para um exemplo de gráfico em 3D com o pacote networkD3 com a rede de advogados de Lazega, acesse aqui. Aproveito para agradecer à querida Bruna Wunderwald pela dica deste pacote. Valeu, Bruna!
Redes 2-mode
Para trabalhar com redes 2-mode no R é preciso saber que o pacote igraph “entende” uma rede de 2 modos quando ela tem um atributo chamado type com valores lógicos TRUE e FALSE. Para usarmos um exemplo, vamos importar a rede de membros da Academy of Management (AOM Membership). O procedimento no UCINET já está descrito acima. Para importar, faça
aom <- read.csv2("C:/Users/.../UCINET data/AOM division membership.txt", header = T, stringsAsFactors = F)
aom <- as.matrix(aom)
Para importar a matriz de afiliações, use
aom <- graph_from_incidence_matrix(aom)
is.bipartite(aom)
## [1] TRUE
summary(V(aom)$type)
## Mode FALSE TRUE NA's
## logical 3324 23 0
Quando temos uma edge list, formato muito comum de dados relacionais, o procedimento requer alguns detalhes a mais. Depois de abrir a edge list e transformá-la num objeto igraph, fazemos um mapeamento dos vértices que pertencem a cada modo para gerar o grafo 2-mode. Depois, salvamos o mapeamento para cada vértice em um objeto (que é uma lista) e atribuímo-lo a um novo atributo criado com o nome type. Para realizar esta tarefa, usarei uma rede de parlamentares em comissões coletada usando o pacote bRasilLegis. O código para baixar esses dados está neste outro post.
parlamentares <- read.csv2("C:/Users/.../orgaos.csv", stringsAsFactors = F)
parlamentares <- as.matrix(parlamentares)
parlamentares <- graph_from_edgelist(parlamentares, directed = F)
is.bipartite(parlamentares)
## [1] FALSE
type <- bipartite_mapping(parlamentares)
V(parlamentares)$type <- type[[2]]
is.bipartite(parlamentares)
## [1] TRUE
plot(parlamentares, vertex.label=NA, vertex.size=3, vertex.color=as.numeric(V(parlamentares)$type)+3, main="Rede de afiliações de \nParlamentares a comissões")
Sintam-se à vontade para comentar. Um abraço a todos.