es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Creando una lista de bordes y nodos a partir de una tabla proporcional de OTU en r.

He creado tablas proporcionales de OTU a partir de recuentos de OTU de bacterias y recuentos de OTU de algas y he seleccionado los 50 taxa principales presentes en ambos marcos de datos. Luego, fusioné los marcos de datos utilizando inner-join(). Mis archivos están configurados para que los taxa sean nombres de columnas (abreviados como B1-B50 para bacterias y D1-50 para algas), y las ubicaciones de mis muestras son nombres de filas.

Solo me pregunto cómo crear una lista de nodos y bordes a partir de este conjunto de datos, por favor. Quiero crear un análisis de red y todos los ejemplos en línea parecen haber creado los bordes y nodos de antemano.

¡Cualquier ayuda sería muy apreciada!

Muchas gracias de antemano 🙂

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para crear una lista de bordes y nodos a partir del conjunto de datos combinado, se pueden seguir estos pasos utilizando el paquete igraph en r:

    1. Convierte tu conjunto de datos combinado en un formato de matriz utilizando as.matrix().
    2. Crea un objeto de gráfico vacío utilizando la función graph.empty().
    3. Agrega nodos al objeto del gráfico utilizando la función add.vertices(). El número de nodos en el gráfico será igual al número de muestras en tus datos (es decir, el número de filas en tu matriz).
    4. Agrega bordes al objeto del gráfico utilizando la función add.edges() con un bucle for. Recorre todas las comparaciones posibles entre los nodos y, si los dos taxa tienen una correlación no nula, agrega un borde al gráfico que conecta a los dos nodos.
    5. Asigna pesos de borde para cada borde en función de la correlación entre los dos taxa utilizando la función set.edge.attribute().
    6. Asigna atributos de nodo (es decir, nombres de taxa) utilizando las funciones V() y vertex.attributes().

    Aquí hay un código de ejemplo utilizando un conjunto de datos ficticio:

    library(igraph)
    
    # Crea un conjunto de datos ficticio
    merged_data <- matrix(c(
      0, 0, 0.5, 0.3, 0.1, 0.9, 0.2, 0, 0.4, 0.6,
      0, 0, 0.7, 0.2, 0.2, 0.3, 0.1, 0, 0.3, 0.5,
      0.5, 0.7, 0, 0.6, 0.8, 0.4, 0.9, 0.4, 0.1, 0.2,
      0.3, 0.2, 0.6, 0, 0.4, 0.1, 0.5, 0.7, 0.3, 0.1,
      0.1, 0.2, 0.8, 0.4, 0, 0.5, 0.2, 0.2, 0.3, 0.5,
      0.9, 0.3, 0.4, 0.1, 0.5, 0, 0.8, 0.1, 0.5, 0.3,
      0.2, 0.1, 0.9, 0.5, 0.2, 0.8, 0, 0.5, 0.2, 0.1,
      0, 0, 0.4, 0.7, 0.2, 0.1, 0.5, 0, 0, 0.2,
      0.4, 0.3, 0.1, 0.3, 0.3, 0.5, 0.2, 0, 0.5, 0.1,
      0.6, 0.5, 0.2, 0.1, 0.5, 0.3, 0.1, 0.2, 0.1, 0
    ), nrow = 10, ncol = 10, dimnames = list(paste0("Muestra", 1:10), c(paste0("B", 1:5), paste0("D", 1:5))))
    
    # Convierte la matriz en un objeto igraph
    g <- graph.empty(n = nrow(merged_data), directed = FALSE)
    
    # Agrega vértices al gráfico
    V(g)$name <- rownames(merged_data)
    V(g)$type <- ifelse(substr(V(g)$name, 1, 1) == "B", "Bacterial", "Algal")
    g <- add.vertices(g, length(V(g)))
    
    # Agrega bordes al gráfico
    for(i in 1:(length(V(g))-1)) {
      for(j in (i+1):length(V(g))) {
        taxa1 <- colnames(merged_data)[which(merged_data[i,] != 0)]
        taxa2 <- colnames(merged_data)[which(merged_data[j,] != 0)]
        common_taxa <- intersect(taxa1, taxa2)
        if(length(common_taxa) > 0) {
          edge <- data.frame(from = i, to = j)
          g <- add.edges(g, edge)
          set.edge.attribute(g, "weight", index = E(g), 
                             value = cor(merged_data[i, common_taxa], merged_data[j, common_taxa]))
        }
      }
    }
    
    # Dibuja el gráfico
    plot(g)
    

    Este código creará un gráfico de red que muestra la correlación entre los 50 principales taxa bacterianos y algales de tus datos. Puedes modificar el código en función de tus datos y requisitos.

Comments are closed.