【问题标题】:Calculation of Moran's I with 4000 records用 4000 条记录计算 Moran's I
【发布时间】:2013-09-21 11:35:40
【问题描述】:

我有 4000 条人工林体积记录。我需要计算整个种植园的 Moran's I。我使用 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 库吗?

  • 并行库如何解决这个问题?

提前致谢 娟

【问题讨论】:

  • 您应该set.seed 使您的问题可重现。不需要使用大矩阵(你可以使用一个小矩阵,一旦你有一些 Infinite 值,你会遇到同样的问题)。

标签: r parallel-processing ape-phylo spdep


【解决方案1】:

您的矩阵中有一些无限的值。这应该适用于 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

【讨论】:

  • 真是太好了!重量计算中的一个简单错误。 谢谢你!
  • 不客气!我看到错误是因为我试图在一个小矩阵中重现问题。
  • 谢谢@egstudy。即使您的代码已解决并且我不需要 ff 库,当我使用 ff 和无限消除运行代码时,我也会收到以下错误消息:Error in x - m :二进制运算符的非数字参数另外:警告消息:在 mean.default(x) 中:参数不是数字或逻辑:返回 NA
  • 你得到一个错误,因为 cbind(ffdf$x, ffdf$y) 给出一个空对象...`,因此 ffdf.dists
  • 然后,我看不出在这段代码中使用 ff 有什么好处。问题可能是处理超过 10000 条记录。 Ff 应该可以出现这个问题。
猜你喜欢
  • 2017-11-16
  • 2021-11-27
  • 1970-01-01
  • 2021-09-23
  • 2021-02-16
  • 1970-01-01
  • 2020-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多