使用嵌套的for循环填充距离矩阵

时间:2018-09-23 07:42:49

标签: r for-loop matrix distance distance-matrix

我在使用data(“ butterfly”)设置时遇到问题。问题是:

问题4:安装软件包“ ade4”,然后安装数据(蝴蝶)。我们的问题是:“遗传相似性是否与蝴蝶菌落之间的地理距离相关?”使用我们称为d1的距离测量值填写遗传距离矩阵。执行Mantel随机测试并解释结果。使用距离d2的测量重复测试。有什么不同吗?显示您的for循环代码作为答案的一部分,并显示Mantel随机测试中的散点图和随机化图。

这是用于计算差异的函数。我不知道如何

dissimilarity <- function(p1, p2){
d1 <- sum( abs(p1 - p2) / 2 )
d2_num <- sum(p1*p2)
d2_denom <- sqrt( sum(p1^2) * sum(p2^2) )
d2 <- 1 - d2_num / d2_denom
return(list(d1=d1, d2=d2))
}

这是我用来建立遗传距离矩阵的代码。

library(ade4)
data("butterfly")

butterflydat<-data.frame(butterfly)
plot(butterfly$contour[,1:2], pch=16, cex=.4)
polygon(butterfly$contour[,1:2], lty=2)
points(butterfly$xy, pch=7)
nrow(butterfly$xy)
text(butterfly$xy, labels=1:16, pos=2, cex=.8)
apply(butterfly$genet,1,sum)
(Ddist <- dist(butterfly$xy))

我能够计算两个地理距离(例如)之间的差异:

dissimilarity(butterfly$genet[1,],butterfly$genet[2,])$d2

但是我不明白如何应用for循环来填充所有地理距离的矩阵。我也不了解Mantel随机化测试。问题在于我们在每个矩阵上进行了Mantel随机化测试,但是测试没有比较两个矩阵(即d1和d2?)之间的相关性吗?

任何帮助将不胜感激,我是统计学和R的新手。

1 个答案:

答案 0 :(得分:0)

您可以使用双for循环或双apply循环来计算相异矩阵。

fun_d2 <- function(x, y) dissimilarity(x, y)$d2

apply(butterfly$genet, 1, function(x)
  apply(butterfly$genet, 1, function(y) fun_d2(x, y)))

需要定义函数fun_d2,因为函数dissimilarity返回一个包含两个成员的列表。