Создание гигантской матрицы для использования в CARBayes без нехватки памяти - PullRequest
1 голос
/ 04 августа 2020

Я пытаюсь выполнить анализ площадных единиц с помощью пакета CARBayes. В рамках анализа я использую приведенный ниже код. Моя проблема возникает, когда я пытаюсь создать соседнюю матрицу с nb2mat. В моем объекте sp есть 170 000 нечетных полигонов, поэтому он не может создать матрицу с имеющейся у меня памятью.

library(spdep)
library(CARBayes)

W.nb <- poly2nb(sp)

W <- nb2mat(W.nb, style = "B", zero.policy = TRUE)

test <- S.CARbym(case ~ covariate1),
             family = "poisson",
             data = sp,
             W = W,
             burnin = 10000,
             n.sample = 30000,
             thin = 20)  

Я нашел приведенный ниже код в другом потоке, чтобы создать матрицу bigmemory, но CARBayes выиграл Не распознаю это как матрицу.

Мой вопрос: знает ли кто-нибудь способ использовать bigmemory или spam / разреженную матрицу или что-то подобное для создания матрицы, чтобы ее можно было использовать в CARBayes, не выдавая ошибку, говоря, что W не является матрицей.


my_listw2mat = function (listw) 
{
  require(bigmemory)
  n <- length(listw$neighbours)
  if (n < 1) 
    stop("non-positive number of entities")
  cardnb <- card(listw$neighbours)
  if (any(is.na(unlist(listw$weights)))) 
    stop("NAs in general weights list")
  #res <- matrix(0, nrow = n, ncol = n)
  res <- big.matrix(n, n, type='double', init=NULL)
  options(bigmemory.allow.dimnames=TRUE)
  
  for (i in 1:n) if (cardnb[i] > 0) 
    res[i, listw$neighbours[[i]]] <- listw$weights[[i]]
  if (!is.null(attr(listw, "region.id"))) 
    row.names(res) <- attr(listw, "region.id")
  res
}

my_nb2mat = function (neighbours, glist = NULL, style = "W", zero.policy = NULL) 
{
  if (is.null(zero.policy)) 
    zero.policy <- get("zeroPolicy", envir = .spdepOptions)
  stopifnot(is.logical(zero.policy))
  if (!inherits(neighbours, "nb")) 
    stop("Not a neighbours list")
  listw <- nb2listw(neighbours, glist = glist, style = style, 
                    zero.policy = zero.policy)
  res <- my_listw2mat(listw)
  attr(res, "call") <- match.call()
  res
}

W <- my_nb2mat(W.nb, style = "B", zero.policy = TRUE)

test <- S.CARbym(case ~ covariate1),
             family = "poisson",
             data = sp,
             W = W,
             burnin = 10000,
             n.sample = 30000,
             thin = 20) 
...