【问题标题】:Filling in a distance matrix using nested for-loop使用嵌套的 for 循环填充距离矩阵
【发布时间】:2019-02-27 01:32:40
【问题描述】:

我在使用 data("butterfly") 集时遇到问题。问题是:

问题4:安装包“ade4”,后跟data(butterfly)。我们的问题是:“遗传相似性是否与蝴蝶群落之间的地理距离相关?”使用我们称为 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 Randomization 测试,但测试不是比较两个矩阵之间的相关性(即 d1 和 d2?)

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

【问题讨论】:

  • data.frame(butterfly) 抛出错误,因为数据集 butterfly 不是表格形式。

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


【解决方案1】:

您可以使用双 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 返回一个包含两个成员的列表。

【讨论】:

    猜你喜欢
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    • 2013-01-19
    相关资源
    最近更新 更多