R中的二次分配程序(QAP)产生不同的结果

时间:2016-10-25 20:59:00

标签: r

我想提前感谢所有关注我的问题并分享他们的想法和经验的人。我正在尝试对五个人的社区之间的行为相关性运行二次分配程序(QAP)。我有10个矩阵表示个体之间的行为频率,我计算了矩阵对之间的相关性(pearson's r)。例如,我发现矩阵1和矩阵2,矩阵2和矩阵3,矩阵3和矩阵4 ......之间的相关性等等。然后,我想使用R软件包sna中的qaptest函数来评估这些相关性的重要性。根据qaptest上的R文档,我将所有矩阵放入一个数组中。然后我计算了矩阵对之间的QAP p值(矩阵1和矩阵2,矩阵2和矩阵3 ......等)。但是,我注意到如果我更改了数组中矩阵的数量(例如,如果我只将前五个放入数组中),则第一组矩阵的QAP p值会发生显着变化。根据我对数组和QAP的理解,这不应该发生,因为删除的矩阵与在矩阵1和矩阵2上运行QAP测试无关。之前是否还有其他人遇到此问题?我在下面包含了我的矩阵和我的脚本。

以下是列表格式的矩阵(在下面的代码中,这是我创建filelist1的步骤。代码的后半部分仅使用矩阵1-5):

[[1]]
  1 2 3 4 5
1 1 0 0 0 0
2 5 0 3 5 0
3 0 0 0 0 0
4 0 0 0 0 0
5 2 0 1 0 0

[[2]]
  1 2  3 4 5
1 0 0  1 0 0
2 3 6 10 1 2
3 0 0  0 0 0
4 0 5  0 0 0
5 0 0  5 0 0

[[3]]
  1 2 3 4 5
1 0 1 0 0 0
2 2 0 5 7 0
3 0 0 0 0 3
4 1 0 0 0 0
5 1 2 2 3 0

[[4]]
  1 2 3 4 5
1 0 6 0 0 2
2 2 0 8 5 0
3 0 5 0 0 0
4 1 0 0 0 0
5 0 0 1 3 2

[[5]]
  1 2 3 4 5
1 0 0 0 0 0
2 1 0 2 5 1
3 0 0 0 0 0
4 1 2 3 0 1
5 0 3 3 1 0

[[6]]
  1 2 3 4 5
1 0 0 0 0 0
2 2 0 3 0 3
3 0 0 0 0 0
4 1 0 4 0 0
5 1 5 7 0 0

[[7]]
  1 2 3 4 5
1 0 0 0 0 0
2 2 0 6 0 3
3 0 0 0 0 0
4 6 0 4 0 0
5 1 0 2 0 0

[[8]]
  1 2 3 4 5
1 0 0 0 1 0
2 2 0 1 6 0
3 0 0 0 0 0
4 0 0 0 0 0
5 6 0 2 2 0

[[9]]
  1 2 3 4 5
1 0 0 0 0 0
2 0 0 2 3 2
3 0 0 0 0 0
4 0 0 0 0 0
5 1 0 2 0 0

[[10]]
  1 2 3 4 5
1 0 0 0 0 0
2 1 0 1 1 0
3 0 0 0 0 0
4 0 0 0 0 0
5 6 0 1 2 0

这是我的R脚本:

# read in all ten of the matrices
a<-read.csv("test1.csv")
b<-read.csv("test2.csv")
c<-read.csv("test3.csv")
d<-read.csv("test4.csv")
e<-read.csv("test5.csv")
f<-read.csv("test6.csv")
g<-read.csv("test7.csv")
h<-read.csv("test8.csv")
i<-read.csv("test9.csv")
j<-read.csv("test10.csv")

filelist<-list(a,b,c,d,e,f,g,h,i,j) #place files in a list
filelist1<-lapply(filelist,function(x){
  x<-x[1:5, 2:6] #choose only columns in the matrix
  colnames(x)<-1:5 #rename columns according to identity
  x<-as.matrix(x) #make a matrix
  return(x)
})

ee<-array(dim=c(5,5,10)) #create an empty array

array<-function(files) {
  names(files) <- c("c1","c2","c3", "c4", "c5", "c6", "c7", "c8", "c9", "c10") #name the matrices
  invisible(lapply(names(files), function(x) assign(x,files[[x]],envir=.GlobalEnv))) #place the matrices in a global environment
  ee[,,1]<-c(c1) #place each matrix in order into the array
  ee[,,2]<-c(c2)
  ee[,,3]<-c(c3)
  ee[,,4]<-c(c4)
  ee[,,5]<-c(c5)
  ee[,,6]<-c(c6)
  ee[,,7]<-c(c7)
  ee[,,8]<-c(c8)
  ee[,,9]<-c(c9)
  ee[,,10]<-c(c10)
  return(ee) #return the completely filled in array
}

a.array<-array(filelist1) # apply the function to the list of matrices

q1.2<-qaptest(a.array,gcor,g1=1,g2=2) #run the qaptest funtion
#a.array is the array with the matrices,gcor tells the function that we want a correlation
#g1=1 and g2=2 indicates that the qap analysis should be run between the first and second matrices in the array.
  summary.qaptest(q1.2) #provides a summary of the qap results
#in this case, the p-value is roughly: p(f(perm) >= f(d)): 0.176 

############ If I take out the last five matrices, the q1.2 p-value changes dramatically
#first clear the memory or R will not create another blank array
rm(list = ls())

a<-read.csv("test1.csv") #read in all five files
b<-read.csv("test2.csv")
c<-read.csv("test3.csv")
d<-read.csv("test4.csv")
e<-read.csv("test5.csv")

filelist<-list(a,b,c,d,e) #create a list of the files
filelist1<-lapply(filelist,function(x){
  x<-x[1:5, 2:6] #include only the matrix
  colnames(x)<-1:5 #rename the columns
  x<-as.matrix(x) #make it a matrix
  return(x)
})

ee<-array(dim=c(5,5,5)) #this time the array only has five slots

array<-function(files) {
  names(files) <- c("c1","c2","c3", "c4", "c5")
  invisible(lapply(names(files), function(x) assign(x,files[[x]],envir=.GlobalEnv)))
  ee[,,1]<-c(c1)
  ee[,,2]<-c(c2)
  ee[,,3]<-c(c3)
  ee[,,4]<-c(c4)
  ee[,,5]<-c(c5)
  return(ee)
}

a.array<-array(filelist1)

q1.2<-qaptest(a.array,gcor,g1=1,g2=2) 
#in this case, the p-value is roughly: p(f(perm) >= f(d)): 0.804 
  summary.qaptest(q1.2)

当我分析完全相同的矩阵对时,我想不出为什么p值会如此不同的原因。唯一的区别是放在阵列中的附加矩阵的数量。还有其他人遇到过这个问题吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

qaptest()从数组的第一维读取图形,而不是最后一维。所以ee[,,1]<-c(c1)(等)应该是ee[1,,]<-c(c1)(等)。当您将所有图形放在第一维中时,qaptests应该产生相同的结果。就个人而言,我更喜欢使用list()代替array() qaptest