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

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

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

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


person jlopez    schedule 21.09.2013    source источник
comment
Вы должны set.seed сделать вашу проблему воспроизводимой. Нет необходимости использовать большую матрицу (вы можете использовать маленькую матрицу, и вы столкнетесь с той же проблемой, если у вас есть несколько бесконечных значений).   -  person agstudy    schedule 21.09.2013


Ответы (1)


У вас есть бесконечные значения в вашей матрице. Это должно работать в двух случаях (с пакетом 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
person agstudy    schedule 21.09.2013
comment
Это так приятно! Простая ошибка в расчете веса. Спасибо! - person jlopez; 21.09.2013
comment
Пожалуйста! Я вижу ошибку, потому что пытался воспроизвести проблему на маленькой матрице. - person agstudy; 21.09.2013
comment
Спасибо @egstudy. Даже если ваш код решен и мне не нужна библиотека ff, когда я запускаю код с ff и бесконечным устранением, я получаю это сообщение об ошибке: Ошибка в x - m : нечисловой аргумент бинарного оператора. Кроме того: Предупреждающее сообщение: In mean.default(x): аргумент не является числовым или логическим: возвращается NA - person jlopez; 21.09.2013
comment
вы получаете сообщение об ошибке, потому что cbind(ffdf$x, ffdf$y) дает пустой объект...` и, следовательно, ffdf.dists ‹- as.matrix(dist(cbind(ffdf$x, ffdf$y)))` пустая матрица.. - person agstudy; 21.09.2013
comment
Тогда я не вижу никаких преимуществ в использовании ff в этом коде. Проблема может заключаться в обработке более 10000 записей. Ff должен быть в состоянии решить эту проблему. - person jlopez; 21.09.2013