sábado, 5 de octubre de 2013

Analisis empírico de redes usando R

Usando análisis de redes

Algunas definiciones importantes desde la perspectiva de grafos

Un grafo es un conjunto de vértices (que también pueden denominarse: nodos, actores) y un conjunto de líneas entre pares de vértices a las que se denomina vínculos (también: edges, links, relaciones). Un grafo representa la estructura de una red.

Matriz de incidencia. Una matriz binaria (los elementos son ceros o unos) y se emplea para representar la ausencia o presencia de, por ejemplo, una relación Matriz de adyacencia, es una matriz cuadrada que se emplea para representar relaciones binarias La matriz una diferencia característica de una matriz de adyacencia con respecto a una matriz de incidencia es que la primera es cuadrada, por tanto simétrica, en tanto que una matriz de incidencia es rectangular.

Las relaciones también pueden representarse con listas que contienen el par odrdenado nodos y vertices.

Grafos. Representaciones y visualizaciones

Existen numerosas opciones para crear un grafo en el paquete igraph. Veamos algunas de ellas. Para visualizar los grafos debemos emplear la función plot()

Grafos. Función graph()

Con la función graph() podemos generar gráficos rápidos, para ello debemos especificar el ID de los nodos:

g <- graph(c(1, 2, 3, 4, 5, 6, 1, 5))
plot(g)

plot of chunk funcionGraph

Podemos crear grafos sin nodos y luego agregarlos poco a poco. Para ello empleamos la función graph.empty. De la misma forma se pueden crear grafos completos, circulares, tipo estrella:

g <- graph.empty()
g <- graph.empty(n = 10)
plot(g)

plot of chunk grafosVarios

g <- graph.star(10, mode = "out")
plot(g)

plot of chunk grafosVarios

g <- graph.star(10, mode = "in")
plot(g)

plot of chunk grafosVarios

plot(graph.ring(10))

plot of chunk grafosVarios

plot(graph.tree(10, 2))

plot of chunk grafosVarios


Grafos.Usando fórmulas

Este tipo de representación es útil para crear grafos pequeños. Las relaciones se representan con:

  • Un signo menos “-” entre nodos cuando la relación es indirecta: A-B
  • Un signo más “+” si la relación es directa y es recíproca entre un par de nodos A+B
  • un signo menos seguido de un signo más para representar la relación direta entre un par de nodos. El signo mas se coloca del lado del nodo que recibe la relación: A-+B
  • Si la relación es similar para varios nodos, entonces se colocan dos puntos entre el primero nodo y el resto: A+B:C:D

Visualizando los grafos anteriores:

# Relacion indirecta
g <- graph.formula(A - B)
plot(g)

plot of chunk grafosFormulas

plot(graph.formula(A + B))

plot of chunk grafosFormulas

plot(graph.formula(A - +B, A + -C:D:E:F, B + F))

plot of chunk grafosFormulas

plot(graph.formula(alicia + bob, ))

plot of chunk grafosFormulas

# creamos algunas relaciones entre personajes de Cien Años de Soledad
plot(graph.formula("jose arcadio" - "jose arcadio buendia":"ursula iguaran", 
    "jose arcadio buendia" - "ursula iguaran", "aureliano" - "jose arcadio buendia":"ursula iguaran", 
    "amaranta" - "jose arcadio buendia":"ursula iguaran", "rebeca" - "nicanor uloa":"rebeca montiel", 
    "jose arcadio" - "rebeca", "jose arcadio" - "pilar ternera", "arcadio" - 
        "jose arcadio":"pilar ternera"))

plot of chunk grafosFormulas

Grafos. Matriz de adyacencia y matriz de incidencia

Creemos una matriz rápidamente:

n <- 10
m <- 10
AA <- matrix(sample(0:1, m * n, replace = TRUE), m, n)
AA
##       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
##  [1,]    0    1    0    1    0    0    0    1    1     1
##  [2,]    1    1    0    1    0    0    0    0    0     0
##  [3,]    1    1    0    1    1    0    0    1    1     0
##  [4,]    1    0    0    0    1    1    1    0    1     1
##  [5,]    0    0    1    0    0    0    0    0    0     1
##  [6,]    1    0    1    1    1    0    1    1    0     0
##  [7,]    0    0    0    1    1    0    1    0    1     0
##  [8,]    1    0    1    1    1    1    0    0    1     0
##  [9,]    0    0    0    0    0    0    1    1    1     0
## [10,]    0    0    1    0    0    0    1    1    1     1
# nombres para las filas y las columnas
colnames(AA) <- c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J")
rownames(AA) <- c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J")
AA
##   A B C D E F G H I J
## A 0 1 0 1 0 0 0 1 1 1
## B 1 1 0 1 0 0 0 0 0 0
## C 1 1 0 1 1 0 0 1 1 0
## D 1 0 0 0 1 1 1 0 1 1
## E 0 0 1 0 0 0 0 0 0 1
## F 1 0 1 1 1 0 1 1 0 0
## G 0 0 0 1 1 0 1 0 1 0
## H 1 0 1 1 1 1 0 0 1 0
## I 0 0 0 0 0 0 1 1 1 0
## J 0 0 1 0 0 0 1 1 1 1

Esta matriz puede ser la representación de la relación entre personas, comunidades, organizaciones países, etc. Supongamos que se trata de las relaciones comerciales entre países. Como queremos representar la relación comercial entr los países, debemo asegurarnos de que la diagonal, donde cada país se cruza consigo mismo sea 0, es decir no consideramos las relaciones comerciales de cada país consigo mismo

diag(AA) <- 0
AA
##   A B C D E F G H I J
## A 0 1 0 1 0 0 0 1 1 1
## B 1 0 0 1 0 0 0 0 0 0
## C 1 1 0 1 1 0 0 1 1 0
## D 1 0 0 0 1 1 1 0 1 1
## E 0 0 1 0 0 0 0 0 0 1
## F 1 0 1 1 1 0 1 1 0 0
## G 0 0 0 1 1 0 0 0 1 0
## H 1 0 1 1 1 1 0 0 1 0
## I 0 0 0 0 0 0 1 1 0 0
## J 0 0 1 0 0 0 1 1 1 0

Creamos entonces el grafo a partir de esta matriz:

plot(graph.adjacency(AA))

plot of chunk grafoAdjacencia

A partir de una matriz de incidencia

n <- 10
m <- 8
AA <- matrix(sample(0:1, m * n, replace = TRUE), m, n)
colnames(AA) <- c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J")
rownames(AA) <- c("A", "B", "C", "D", "E", "F", "G", "H")
diag(AA) <- 0
plot(graph.incidence(AA, directed = TRUE))

plot of chunk grafo incidencia

Grafo. Data.frame

En ocasiones la data que tenemos está en forma de data.frame. En esos casos sólo empleamos la función graph.data.frame()

plot(graph.data.frame(rebeliones[, c(8, 7)]))

plot of chunk grafoDataFrame

caso1 <- as.matrix(table(colonia))
g <- graph.incidence(caso1, mode = c("all"))
plot(g)