Расчет Морана I с 4000 записей

У меня 4000 записей объема на плантации деревьев. Мне нужно рассчитать Моран I для всей плантации. Я использую библиотеку обезьян, потому что говорят, что 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 вместо библиотеки обезьян?

  • Как параллельная библиотека может решить эту проблему?

Заранее спасибо хуан

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
Другие вопросы по тегам