Совместные сети, использующие данные о присутствии / отсутствии R - PullRequest
0 голосов
/ 11 февраля 2019

Я пытаюсь составить сетевой график для моего присутствия / отсутствия данных о видах бактерий, но я не уверен, что с этим делать.Я надеюсь закончить чем-то вроде этого введите описание изображения здесь , где каждый вид связан с другим видом, если они оба присутствуют у одного и того же пациента, с большим кругом для видов с более высокой частотой.Первоначально я пытался использовать пакеты widyr и tidygraph, но я не уверен, совместим ли мой набор данных с ними введите описание изображения здесь , поскольку в нем пациенты представлены в виде столбцов, а отдельные виды - в виде строк.Предпочтительно я хотел бы знать, какие пакеты / код я мог бы использовать для работы с моим набором данных или как я мог бы изменить свой набор данных для работы с этими пакетами.

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Как и Istrel, я бы также порекомендовал igraph.Возможно второе решение с ggplot ..

library(ggnetwork)
library(ggplot2)
library(igraph)

#sample data:
set.seed(1)
mat <- matrix(rbinom(50 * 5, 1, 0.1), ncol = 15, nrow = 100)

# This is not necessary for the example data. But in your case, if you want  species as nodes you have to do a transpose: 
#mat <- t(mat)

#### Optional! But usually there are often "empty cases" which you might want to remove: 
# remove 0-sum-columns
mat <- mat[,apply(mat, 2, function(x) !all(x==0))] 
# remove 0-sum-rows
mat <- mat[apply(mat, 1, function(x) !all(x==0)),]

# transform in term-term adjacency matrix
mat.t <- mat  %*% t(mat)

##### calculate graph 
g <- igraph::graph.adjacency(mat.t,mode="undirected",weighted=T,diag=FALSE)

# calculate coordinates (see https://igraph.org/r/doc/layout_.html for different layouts)
layout <- as.matrix(layout_with_lgl(g))

p<-ggplot(g, layout = layout, aes(x = x, y = y, xend = xend, yend = yend)) +
  geom_edges( color = "grey20", alpha = 0.2, size = 2) + # add e.g. curvature =  0.15 for curved edges
  geom_nodes(size =  (centralization.degree(g)$res +3) , color="darkolivegreen4", alpha = 1) +
  geom_nodes(size =  centralization.degree(g)$res , color="darkolivegreen2", alpha = 1) +
  geom_nodetext(aes(label = vertex.names), size= 5) +
  theme_blank()
p

введите описание изображения здесь

Используйте эстетику ggplot:

# calculate degree:
V(g)$Degree <- centralization.degree(g)$res

p<-ggplot(g, layout = layout, aes(x = x, y = y, xend = xend, yend = yend)) +
  geom_edges( color = "grey20", alpha = 0.2, size = 2) + # add e.g. curvature = 0.15 for curved edges
  geom_nodes(aes(size =  Degree) , color="darkolivegreen2", alpha = 1) +
  scale_size_continuous(range = c(5, 16)) +
  geom_nodetext(aes(label = vertex.names), size= 5) +
  theme_blank()
p
0 голосов
/ 11 февраля 2019

Вы можете использовать матричный перекрестный продукт, чтобы получить матрицу совместного использования.Тогда просто преобразовать матрицу смежности в граф с пакетом igraph.Попробуйте это:

library(igraph)

# Create fake data set
# rows = patients
# cols = species
set.seed(2222)
df <- matrix(sample(c(TRUE, FALSE), 50, replace = TRUE), 5)
colnames(df) <- letters[1:10]

# Generate co-occurrence matrix with crossproduct
co_mat <- t(df) %*% df

# Set diagonal values to 0
diag(co_mat) <- 0

# Assign dim names
dimnames(co_mat) <- list(colnames(df), colnames(df))

# Create graph from adjacency matrix
# ! edge weights are equal to frequency of co-occurrence
g <- graph_from_adjacency_matrix(co_mat, mode = "upper", weighted = TRUE)

# Assign nodes weight equal to species frequency
g <- set.vertex.attribute(g, "v_weight", value = colSums(df))

plot(g, vertex.size = V(g)$v_weight * 5 + 5, edge.width = E(g)$weight * 5)

Вот наши поддельные данные

         a     b     c     d     e     f     g     h     i     j
[1,]  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE
[2,]  TRUE FALSE FALSE FALSE  TRUE  TRUE  TRUE FALSE  TRUE FALSE
[3,] FALSE  TRUE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE
[4,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE
[5,] FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE  TRUE  TRUE FALSE

А вот и результат:

Example of plot output

...