R语言如何高效计算莫兰指数(Moran's I)方差对应的S1项?
莫兰指数S1项高效计算方案
首先明确S1的计算公式逻辑为所有空间权重元素与其对称位置元素之和的平方和除以2,即 S1 = 0.5 * sum((w[i,j] + w[j,i])^2),以下是不同实现方案:
最优方案:矩阵向量化运算(推荐,效率最高)
R的矩阵运算底层为C实现,完全避免了R层循环的性能损耗,无论是小矩阵还是大尺寸权重矩阵效率都远高于循环类方案,代码仅需2行:
# 假设你的空间权重矩阵存储在变量w中 w_transpose <- t(w) S1 <- sum((w + w_transpose) ^ 2) / 2
参考方案:lapply实现
如果需要用列表迭代类的写法,可以用嵌套lapply实现,性能略逊于矩阵运算但优于纯双层for循环:
n <- nrow(w) S1_lapply <- sum(unlist(lapply(1:n, function(i) { sapply(1:n, function(j) (w[i,j] + w[j,i])^2) }))) / 2
结果验证
可以用你现有的双层for循环计算结果做校验,两种方案的计算结果和for循环完全一致。
内容的提问来源于stack exchange,提问作者Shawn Brar
相关产品推荐
相关产品推荐

