R/Конверсия биграфа в монограф

Материал из Letopisi.Ru — «Время вернуться домой»
(Различия между версиями)
Перейти к: навигация, поиск
(Новая страница: «Превращение биграфа в граф = история превращения графа, в котором есть и * http://www.r-blogg…»)
 
 
(не показаны 12 промежуточных версий 1 участника)
Строка 1: Строка 1:
Превращение [[биграф]]а в [[граф]] = история превращения графа, в котором есть и  
+
Превращение [[биграф]]а в [[граф]] = история превращения графа, в котором есть и субъекты - person и объекты
  
* http://www.r-bloggers.com/working-with-bipartiteaffiliation-network-data-in-r/
+
Исходный пример - есть люди и есть группы, к которым они относятся
* http://www.r-bloggers.com/working-with-bipartiteaffiliation-network-data-in-r/ - Working with Bipartite/Affiliation Network Data in R (Solomon)
+
** Data can often be usefully conceptualized in terms affiliations between people (or other key data entities). It might be useful analyze common group membership, common purchasing decisions, or common patterns of behavior.- готовый хороший текст + лабораторные работы на стыке [[R]] + [[SoNIA]]
+
  
library('Matrix')
+
# obebukhova Литература
A <- spMatrix(nrow=length(unique(df$person)),
+
# sch27@tagobr.ru    Литература
        ncol=length(unique(df$group)),
+
        i = as.numeric(factor(df$person)),
+
        j = as.numeric(factor(df$group)),
+
        x = rep(1, length(as.numeric(df$person))) )
+
row.names(A) <- levels(factor(df$person))
+
colnames(A) <- levels(factor(df$group))
+
A
+
  
Arow <- A %*% t(A)  # users
+
=== Загружаем исходный файл и переводим ===
Acol <- t(A) %*% A # pages
+
  
А дальше может работать отдельно с участниками и страницами и их связями
+
ghist <- read.csv(file.choose(),sep=",", as.is=T, header=T, encoding ="UTF-8") # чтобы сохранить русские значения
 +
ghist <- na.omit(ghist ) # если там были пропущенные значения, то удалим их
 +
 
 +
g2 <- data.frame(User = paste("U",ghist[,1],sep=":" ) , Page = paste("P",ghist[,2],sep=":") ) # если мы хотим добавим указания на страницы и участников
 +
g2 <- data.frame(User = ghist[,1] , Page = ghist[,2] ) #
 +
 
 +
И с этим графом - [[биграф]]ом работаем.
 +
 
 +
 
 +
==== bipartite.projection ====
 +
 
 +
rm(list=ls())
 +
df  <- data.frame(perpetrator=c("A","A","B","C","D","A","E","A","F","G"), target=c("a","a","a","b","c","d","e","a","f","f"))
 +
net <- graph.edgelist(as.matrix(df))
 +
V(net)$type <- bipartite.mapping(net)$type
 +
par(mfrow=c(1,2),mar=c(0,1,1,1))
 +
plot(net, main="Full Network",edge.arrow.size=0.5)
 +
plot(bipartite.projection(net)$proj2,main="Affilitaton Network")
 +
 
 +
=== Превращение из биграфа в one-mode ===
 +
 
 +
  library('Matrix') # пакет для работы с матрицами
 +
 
 +
A <- spMatrix(nrow=length(unique(g2$User)),
 +
              ncol=length(unique(g2$Page)),
 +
              i = as.numeric(factor(g2$User)),
 +
              j = as.numeric(factor(g2$Page)),
 +
              x = rep(1, length(as.numeric(g2$User))) )
 +
row.names(A) <- levels(factor(g2$User))
 +
colnames(A) <- levels(factor(g2$Page))
 +
Arow <- A %*% t(A)  ## Это у нас граф участников
 +
Acol <- t(A) %*% A ## А это у нас связи группы
 +
 
 +
=== Отдельно посмотрим на граф участников ===
 +
 
 +
Скорее всего, он очень большой, так что лучше бы его в output послать
 +
 
 +
 
 +
gu <- graph_from_adjacency_matrix(Arow,mode = c("directed"), weighted = NULL, diag = TRUE, add.colnames = NULL, add.rownames = NA) # получаем граф
 +
gu <- simplify(gu) # Упрощаем граф
 +
 
 +
 
 +
=== Граф статей или групп  ===
  
 
  gn <- graph_from_adjacency_matrix(Arow,mode = c("directed"), weighted = NULL, diag = TRUE, add.colnames = NULL, add.rownames = NA) # получаем граф
 
  gn <- graph_from_adjacency_matrix(Arow,mode = c("directed"), weighted = NULL, diag = TRUE, add.colnames = NULL, add.rownames = NA) # получаем граф
gn <- simplify(gn) # Упрощаем граф
 
  
 +
Или!
 +
gn <- graph_from_adjacency_matrix(Acol, mode = "undirected", diag = TRUE)
 +
gn <- graph_from_adjacency_matrix(Acol, mode = c("directed"), diag = TRUE)
 +
 +
и еще лучше с учетом веса:
 +
 +
  gm  <- graph_from_adjacency_matrix(Acol, weighted=T, mode = "undirected")
 +
  gm <- simplify(gm)
 +
  E(gm)$label = E(gm)$weight # указываем вес на ребрах
 +
  set.seed(10)
 +
 +
Now we need to tansform the graph so that multiple edges become an attribute ( E(g)$weight ) of each unique edge:
 +
 +
 +
E(gn)$weight <- count.multiple(gn)
 +
gn <- simplify(gu) # Упрощаем граф
 +
 +
E(gn)$label = E(gn)$weight # Вес ребра будет показан на нем - label
 +
plot(gn, layout=layout.fruchterman.reingold, vertex.color="gray60", vertex.size = 15, edge.arrow.size = 0.1, edge.color = "gray80", edge.width = 1+E(gn)$weight/24 )
 +
 +
 +
plot(gn, layout=layout.kamada.kawai, vertex.color="gray60", vertex.size = 25, edge.arrow.size = 0.5, edge.color = "gray80", edge.width = gn$weight )
 +
 +
 +
----
 +
 +
[[Файл:Eduwn.png]]
 +
 +
 +
=== Ссылки: ===
 +
* http://www.r-bloggers.com/working-with-bipartiteaffiliation-network-data-in-r/
 +
* http://www.r-bloggers.com/working-with-bipartiteaffiliation-network-data-in-r/ - Working with Bipartite/Affiliation Network Data in R (Solomon)
 +
** Data can often be usefully conceptualized in terms affiliations between people (or other key data entities). It might be useful analyze common group membership, common purchasing decisions, or common patterns of behavior.- готовый хороший текст + лабораторные работы на стыке [[R]] + [[SoNIA]]
 +
* https://www.r-bloggers.com/collapsing-a-bipartite-co-occurrence-network/
 +
**  http://f.briatte.org/r/turning-keywords-into-a-co-occurrence-network Turning keywords into a co-occurrence network
 +
 +
To convert a two-mode incidence matrix to a one-mode adjacency matrix, one can simply multiply an incidence matrix by its transpose.
 +
 +
n <- m %*% t(m) %>%
 +
  graph_from_adjacency_matrix(mode = "undirected", diag = FALSE, weighted = TRUE)
  
 +
----
 
[[Категория:Учебная аналитика]]
 
[[Категория:Учебная аналитика]]
 
[[Категория:R]]
 
[[Категория:R]]

Текущая версия на 15:50, 25 мая 2019

Превращение биграфа в граф = история превращения графа, в котором есть и субъекты - person и объекты

Исходный пример - есть люди и есть группы, к которым они относятся

  1. obebukhova Литература
  2. sch27@tagobr.ru Литература

Содержание

[править] Загружаем исходный файл и переводим

ghist <- read.csv(file.choose(),sep=",", as.is=T, header=T, encoding ="UTF-8") # чтобы сохранить русские значения
ghist <- na.omit(ghist ) # если там были пропущенные значения, то удалим их
g2 <- data.frame(User = paste("U",ghist[,1],sep=":" ) , Page = paste("P",ghist[,2],sep=":") ) # если мы хотим добавим указания на страницы и участников
g2 <- data.frame(User = ghist[,1] , Page = ghist[,2] ) # 

И с этим графом - биграфом работаем.


[править] bipartite.projection

rm(list=ls())
df  <- data.frame(perpetrator=c("A","A","B","C","D","A","E","A","F","G"), target=c("a","a","a","b","c","d","e","a","f","f"))
net <- graph.edgelist(as.matrix(df))
V(net)$type <- bipartite.mapping(net)$type
par(mfrow=c(1,2),mar=c(0,1,1,1))
plot(net, main="Full Network",edge.arrow.size=0.5)
plot(bipartite.projection(net)$proj2,main="Affilitaton Network")

[править] Превращение из биграфа в one-mode

 library('Matrix') # пакет для работы с матрицами 
A <- spMatrix(nrow=length(unique(g2$User)),
             ncol=length(unique(g2$Page)),
             i = as.numeric(factor(g2$User)),
             j = as.numeric(factor(g2$Page)),
             x = rep(1, length(as.numeric(g2$User))) )
row.names(A) <- levels(factor(g2$User))
colnames(A) <- levels(factor(g2$Page))
Arow <- A %*% t(A)  ## Это у нас граф участников
Acol <- t(A) %*% A ## А это у нас связи группы

[править] Отдельно посмотрим на граф участников

Скорее всего, он очень большой, так что лучше бы его в output послать


gu <- graph_from_adjacency_matrix(Arow,mode = c("directed"), weighted = NULL, diag = TRUE, add.colnames = NULL, add.rownames = NA) # получаем граф
gu <- simplify(gu) # Упрощаем граф


[править] Граф статей или групп

gn <- graph_from_adjacency_matrix(Arow,mode = c("directed"), weighted = NULL, diag = TRUE, add.colnames = NULL, add.rownames = NA) # получаем граф

Или!

gn <- graph_from_adjacency_matrix(Acol, mode = "undirected", diag = TRUE)
gn <- graph_from_adjacency_matrix(Acol, mode = c("directed"), diag = TRUE)

и еще лучше с учетом веса:

 gm  <- graph_from_adjacency_matrix(Acol, weighted=T, mode = "undirected") 
 gm <- simplify(gm)
 E(gm)$label = E(gm)$weight # указываем вес на ребрах
 set.seed(10)

Now we need to tansform the graph so that multiple edges become an attribute ( E(g)$weight ) of each unique edge:


E(gn)$weight <- count.multiple(gn) 
gn <- simplify(gu) # Упрощаем граф

E(gn)$label = E(gn)$weight # Вес ребра будет показан на нем - label
plot(gn, layout=layout.fruchterman.reingold, vertex.color="gray60", vertex.size = 15, edge.arrow.size = 0.1, edge.color = "gray80", edge.width = 1+E(gn)$weight/24 )


plot(gn, layout=layout.kamada.kawai, vertex.color="gray60", vertex.size = 25, edge.arrow.size = 0.5, edge.color = "gray80", edge.width = gn$weight )



Eduwn.png


[править] Ссылки:

To convert a two-mode incidence matrix to a one-mode adjacency matrix, one can simply multiply an incidence matrix by its transpose.

n <- m %*% t(m) %>%
 graph_from_adjacency_matrix(mode = "undirected", diag = FALSE, weighted = TRUE)

Инструменты