<https://mail.google.com/mail/u/1?ui=2&ik=c7baaa68e4&attid=0.1&permmsgid=msg-a:r3820358430069158449&th=16b99a1eaec32659&view=att&disp=safe&realattid=f_jxetzjxb0>
Hello,


I am currently working on modifying a code I found on the paper " Mutual
assessment during ritualized fighting in mantis shrimp" (Green and Patek,
2017) (I sent you the code attached : " code to permute and plot
behavioural sequence data ")


My aim was to help my PI generate a code that would take the data that she
has (an adjacency matrix counting the transitions from one behavior to
another. I sent you one of the matrices attached so you could visualise it)
and make the same permutation test that they implemented in the code, but
also give her the graphs from her adjacency matrices.
I managed to do the first thing generating the transition matrix from the
adjacency one , but I don't seem to be getting anywhere when it comes to
the Igraph part... (I sent you the modified code "Sequential Behavioural
Analyss backwards" )

The problem that I have is that when I run the original code, there's a
problem in this section  :

#generate the observed adjacency matrix
graph<-graph.data.frame(data,directed = T)
adjacency.matrix<-get.adjacency(graph,sparse=F)
#check that this is a 14x14 matrix for Green & Patek 2017
#if using your own data, the matrix should be n x n for an ethogram with n
possible behaviours
adjacency.matrix

The graph cannot be shown in R and it gives me this error message :

Error in adjacent_vertices(x, i, mode = if (directed) "out" else "all") :
  At iterators.c:759 : Cannot create iterator, invalid vertex id,
Invalid vertex id


This message appears also whenever I try to look at a graph from the
modified code...


I tried looking at R help and tried to understand a little how the
functions work but I really don'tunderstand... If you could give me
just some theoretical insight in how this works, it would b really
useful.

I may not be clear, if you need more information or some clarifications
please let me know.

Sorry to bother you and thank you for your time,
############################################################
#### code to permute and plot behavioural sequence data ####
############ used in Green & Patek 2017 ####################
############################################################

#Load required packages
library('sand')
library('igraph')
library('sna')
library('diagram')

#load data
data<-read.csv('',header=F)
#inspect data
head(data)
#remove the first row (column descriptors) and the last two columns (contest 
descriptors)
data<-data[-c(1),-c(3,4)]
#the resulting dataset should have only 2 columns.

#generate the observed adjacency matrix
graph<-graph.data.frame(data,directed = T)
adjacency.matrix<-get.adjacency(graph,sparse=F)
#check that this is a 14x14 matrix for Green & Patek 2017
#if using your own data, the matrix should be n x n for an ethogram with n 
possible behaviours
adjacency.matrix 

#permutation test
#define the number of permutations and create an empty list array to be filled
m<-10000
results<-as.list(NA)
#the loop below resamples the second column of the dataset w/o replacement to 
permute it.
#each iteration is saved as a matix in a list object (results[[i]])
for (i in 1:m){
  perm<-data
  perm[,2]<-perm[sample(1:nrow(perm),replace=FALSE),2]
  perm.graph<-graph.data.frame(perm,directed = T)
  perm.adjacency.matrix<-get.adjacency(perm.graph,sparse=F)
  results[[i]]<-perm.adjacency.matrix
}
#inspect one sample from results; it should look like a 14x14 adjacency matrix
results[[3456]]

#reorganize list structure of results 
listVec <- lapply(results, c, recursive=TRUE)
x <- do.call(cbind, listVec)
#for Green & Patek 2017, the structure of "x" should be 196 rows each with 
10,000 columns.
#each row in x is organized moving down the adjacency matrices, 
#e.g. row 15 in x has the permutation values for row 1, col 2 (x-->t 
transtition) in adjacency matrix

#if you want, plot a histogram of a row of x of interest
#this is row 15: the x-->t transition 
hist(x[15,])
#the observed RM dataset has 44 x-->t transitions.
abline(v=44)
#If the observed transition occurred more frequently than expected, the 
observed value should be toward the edge of the permuted distribution.
#can do the same for the BLM dataset.

#calculate 5% and 95% quantile for permuted data
#Green & Patek 2017 uses only the 95% quantile, but the 5% may be useful if 
interested in which behaviours occurred less frequently than expected.
quantiles<-matrix(NA,nrow=nrow(x),ncol=2)
for (i in 1:nrow(x)){
  q<-quantile(x[i,],probs=c(0.05,0.95))
  quantiles[i,]<-q
}

#check structure of quantiles
head(quantiles)
str(quantiles)
#each row should show the low (column 1) and high (column 2) quantile for a 
transition (196 total rows)

#save matrices for each of the low and high quantile data
low<-matrix(quantiles[,1],nrow=14,byrow=F)
high<-matrix(quantiles[,2],nrow=14,byrow=F)

#rename the low and high quantile datasets to match the observed adjacency 
matrix
colnames(low)<-colnames(adjacency.matrix)
rownames(low)<-colnames(adjacency.matrix)
colnames(high)<-colnames(adjacency.matrix)
rownames(high)<-colnames(adjacency.matrix)

#inspect low, high, and observed matrices
low
high
adjacency.matrix

#save the low and high quantile datasets
write.csv(low,file='low_quantiles.csv')
write.csv(high,file='high_quantiles.csv')
#save the observed adjacency matrix
write.csv(adjacency.matrix,file='observed.csv')

##########################################################################
#### calculating transitional probabilities from the observed dataset ####
##########################################################################
#pull out the transitional probability values from the observed matrix
#divide each cell by the row sum
trans.prob<-round(adjacency.matrix/rowSums(adjacency.matrix),2) 
trans.prob[is.nan(trans.prob)]<-0 #replace any NaN values with 0
trans.prob
#simplify the dataset to keep only those cell values where adjacency matrix is 
greater or equal to high quantile
#keep the original transitional probabilities, i.e. before simplification
keep<-ifelse(adjacency.matrix>=high,trans.prob,0)
#inspect the "keep" matrix
keep
#save the transitonal probability dataset
write.csv(trans.prob,file='transitional_probability.csv')

##################################################
#### visualising the transitions using igraph ####
##################################################
#create a network object from the significant transitional probability matrix 
(transitions more frequent than expected)
network<-graph.adjacency(keep,weighted=TRUE,diag=TRUE)
#set vertex (circle) sizes to be equal to scaled degree of adjacency matrix
vertex_sizes<-degree(adjacency.matrix,rescale=TRUE)
#set edge (arrow) weights to be equal to 5 categories of edge weight (# of 
transitions)
edge_weights<-as.numeric(cut(E(network)$weight,c(0,.1,.25,.5,.75,1),labels=c(1:5)))
#plot the network - will open another window
#tkplot may not work with a Mac, but there may be other options available. 
plot<-tkplot(network)
#move the vertices around to make an organized figure
#save the coordinates from this plot
#you can also load coordinates for each vertex as a matrix with n rows (one for 
each vertex) and 2 columns with x (col 1) and y (col 2) position
coords<-tkplot.getcoords(plot)
#finally, create a network plot using the above coordinates and weights.
plot.igraph(network,vertex.label=V(network)$name, vertex.label.cex = 1.25, 
layout=coords,vertex.size=vertex_sizes*150, edge.width=edge_weights/4, 
edge.arrow.size=edge_weights/4)
#note that some factors are multiplied or divided (e.g., vertex_sizes*150) to 
make them easier to see.
Behavior,Flag,Flash,Up,Vocal,Call,Contact
Flag,60,12,27,2,0,3
Flash,15,14,13,3,0,1
Up,33,12,30,6,3,9
Vocal,2,4,5,0,0,0
Call,0,0,0,0,0,7
Contact,4,6,15,0,7,19

Attachment: Sequencial Behavioural Analysis backwards (1).R
Description: Binary data

_______________________________________________
igraph-help mailing list
igraph-help@nongnu.org
https://lists.nongnu.org/mailman/listinfo/igraph-help

Reply via email to