R spdep巨型重量矩阵

时间:2015-03-11 14:29:59

标签: r geospatial sparse-matrix spatial spdep

我是空间统计学的新手,我试图在美国的R中为所有人口普查区创建空间权重矩阵。大约有74000个小册子。

根据美国人口普查Tiger文件,我创建了一个包含所有区域的shapefile,然后(使用spdep包):

#Create adjacency matrix
am = poly2nb(us)
is.symmetric.nb(am)

这很好用,虽然我很大。

下一步:

am = nb2mat(am, style="B",zero.policy=T)

这给了我这个错误:

Error: cannot allocate vector of size 40.9 Gb

显然我的笔记本电脑无法处理40.9 Gb的内存。我尝试在AWS EC2云上执行此操作,但为了获得那么多内存,我需要获得一个非常大的实例,我想避免这个实例,因为我在云计算方面是全新的并且宁愿玩免费的T2.micro沙箱(最大可达1 GiB的内存),直到我准备好在更大的机器上花一些钱。如果我可以将权重矩阵变成稀疏矩阵,我想我能够处理它,但我不知道如何做到这一点。我尝试过这样的事情:

Wmat<-Matrix(nb2mat(am, style="B",zero.policy=T),sparse=TRUE)

但是在创建稀疏矩阵之前,仍然需要所有内存来执行nb2mat命令。

任何解决方案?

1 个答案:

答案 0 :(得分:0)

当然有点晚了。但我想我只想出一个解决方案。我有一个71k * 71k矩阵的类似情况。

我只是重写了nb2mat函数来使用bigmemory库中的big.matrix。我们需要定义两个新函数:

    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
    }

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函数:

a=my_nb2mat(neighbours = out, style='W',zero.policy =F )

注意:bigmemory库似乎只适用于R \ R-2.15.3。