我在树木种植园中有4000个体积记录。我需要计算整个种植园的莫兰一世。我使用 ape 库,因为据说 spdep 较慢。 我的代码是这样的:
# Modified from http://www.ats.ucla.edu/stat/r/faq/morans_i.htm
require(ape)
df <- data.frame(
x = 1:2000,
y = 1:2000,
v = rnorm(4000, mean=4) )
df.dists <- as.matrix(dist(cbind(df$x, df$y)))
df.dists.inv <- 1/df.dists
diag(df.dists.inv) <- 0
Moran.I(df$v, df.dists.inv)
当我运行代码时,我会遇到溢出错误。
*Error in if (obs <= ei) 2 * pv else 2 * (1 - pv) :
missing value where TRUE/FALSE needed*
使用ff库
require(ape)
require(ff)
ffdf <- as.ffdf(df)
ffdf.dists <- as.matrix(dist(cbind(ffdf$x, ffdf$y)))
ffdf.dists.inv <- 1/df.dists
diag(ffdf.dists.inv) <- 0
Moran.I(ffdf$v, ffdf.dists.inv)
更多错误讯息:
*Error in x - m : non-numeric argument to binary operator
In addition: Warning message:
In mean.default(x) : argument is not numeric or logical: returning NA*
如何计算整个种植园?
我应该使用 sdep 而不是 ape 库吗?
并行库如何解决此问题?
提前致谢 涓
答案 0 :(得分:9)
你的矩阵中有一些无穷大的值。这应该适用于2种情况(有和没有ff包)
df.dists.inv[is.infinite(df.dists.inv)] <- 0
用一个小例子来应用它:
require(ape)
set.seed(1)
df <- data.frame(
x = 1:10,
y = 1:10,
v = rnorm(20, mean=4) )
.....
df.dists.inv[is.infinite(df.dists.inv)] <- 0
Moran.I(df$v, df.dists.inv)
$observed
[1] -0.02246154
$expected
[1] -0.05263158
$sd
[1] 0.05399303
$p.value
[1] 0.5763143