library(readr)
## Warning: package 'readr' was built under R version 4.2.3
library(igraph)
## Warning: package 'igraph' was built under R version 4.2.3
## 
## Attaching package: 'igraph'
## The following objects are masked from 'package:stats':
## 
##     decompose, spectrum
## The following object is masked from 'package:base':
## 
##     union
library(readxl)
## Warning: package 'readxl' was built under R version 4.2.3
interacciones <- read_excel("C:/Users/julio/Downloads/Agresiones Abejas Sandia.xlsx", sheet = "Hoja4")

head(interacciones)
## # A tibble: 6 × 2
##   Atacante Atacado
##   <chr>    <chr>  
## 1 M        M      
## 2 M        F      
## 3 N        N      
## 4 N        P      
## 5 N        M      
## 6 M        N

Lo que sigue definimos una función para construir un Grafo de De Bruijn

build_de_bruijn_graph <- function(interacciones, k) {
  interacciones <- as.data.frame(interacciones)
  
   # Construir k-mers
  k_mers <- lapply(1:(nrow(interacciones) - k + 1), function(i) {
    interacciones[i:(i+k-1), c("Atacante", "Atacado")]
  })
  
  # Crear las aristas del grafo
  edges <- do.call(rbind, lapply(k_mers, function(k_mer) {
    from <- k_mer[1, "Atacante"]
    to <- k_mer[2, "Atacado"]
    data.frame(from = from, to = to)
  }))
  
  graph <- graph_from_data_frame(edges, directed = TRUE)
  return(graph)
}

Construimos el Grafo de De Bruijn con k = 2 (ya que cada transición debe considerar pares de eventos consecutivos)

k <- 2
de_bruijn_graph <- build_de_bruijn_graph(interacciones, k)

Graficamos el grafo

plot(de_bruijn_graph, vertex.size = 15, vertex.label.cex = 0.5, 
     edge.arrow.size = 0.3, layout = layout_with_kk)

Mostramos el grado de cada nodo, el grado no es más que cuantas aristas se conecta al nodo.

degree_data <- degree(de_bruijn_graph)
print(degree_data)
##  M  N  L VV  P VR  F TF TT 
## 32 67 25 11  7 22  1  1  4

Calculamos y mostramos la centralidad de intermediación

betweenness_data <- betweenness(de_bruijn_graph)
print(betweenness_data)
##          M          N          L         VV          P         VR          F 
##  6.5834008 11.3318826  0.1666667  0.5833333  5.0000000  1.3347166  0.0000000 
##         TF         TT 
##  0.0000000  0.0000000

Detectamos lass comunidades utilizando el algoritmo de clusterización de walktrap

communities <- cluster_walktrap(de_bruijn_graph)
print(membership(communities))
##  M  N  L VV  P VR  F TF TT 
##  1  1  1  1  1  1  1  1  1

El significado de lo anterior en el contexto de la agresividad de las especies sería:

  1. Grado de los Nodos El grado de un nodo en el grafo indica cuántas conexiones (aristas) tiene ese nodo. En este contexto, un nodo representa una combinación de hora, atacante y atacado. Un alto grado sugiere que esa combinación específica de hora y especies es frecuente en las interacciones.

  2. Centralidad de Intermediación La centralidad de intermediación mide la cantidad de veces que un nodo actúa como puente a lo largo del camino más corto entre otros dos nodos. Un nodo con alta centralidad de intermediación es crucial para las interacciones y puede indicar que ciertas combinaciones de hora y especies son puntos de convergencia en las secuencias de agresión.

  3. Comunidades Las comunidades identificadas a través del algoritmo de walktrap muestran grupos de nodos que están más densamente conectados entre sí que con el resto del grafo. Esto puede indicar patrones específicos de interacción que ocurren en ciertas horas o entre ciertas especies.