【问题标题】:pixel level regression with large raster dataset具有大型栅格数据集的像素级回归
【发布时间】:2016-05-26 06:16:11
【问题描述】:

我正在尝试拟合glm 模型,其中y, x1 + x2....xnrasterStack 对象中的层。我尝试将光栅堆栈转换为dataframeobject,但出现矢量大小错误,如下所示。相反,我想尝试使用栅格图层作为输入来拟合回归模型 - 考虑到文件大小和内存错误,无需将图层转换为数据框。这可能吗?您将如何配置它?
我要拟合的模型是自然的:m1<-glm(y1~x1 + x2, family=binomial(), data=layers),但我没有达到这一点,因为我无法将数据转换为数据框以进行模型拟合。

dat<-as.data.frame(stack(layers[c(y1,x1,x2)]))
Error: cannot allocate vector of size 40GB

【问题讨论】:

  • 数据似乎太大了。您是否尝试使用一小部分数据进行测试?您有什么数据类型(例如 csv、...)?
  • 数据的一小部分可以工作。数据类型是rasterStack,有 5 层,尝试将rasterStacks 转换为数据框时出现错误。但也许我不必转换并且可以直接将模型拟合到rasterStacks
  • 我从未使用过光栅。那么 dat1
  • 我明白你的意思。然而,单独加载 1-n 层作为数据帧似乎并不能解决内存问题。我的解决方法是直接馈入栅格图层而无需转换..因此我的问题。
  • 有道理,马丁。我使用几个不同的范围对栅格进行了子集化,并在这些范围上单独运行 glm。然后我在 MuMIn 包中的模型选择和平均框架中运行这些模型。

标签: r r-raster


【解决方案1】:

以下是一些带有 Raster* 数据的回归示例(来自 ?calc):

创建示例数据

r <- raster(nrow=10, ncol=10)
s1 <- lapply(1:12, function(i) setValues(r, rnorm(ncell(r), i, 3)))
s2 <- lapply(1:12, function(i) setValues(r, rnorm(ncell(r), i, 3)))
s1 <- stack(s1)
s2 <- stack(s2)

一个砖(或堆栈)中的值与另一个的回归

s <- stack(s1, s2)
# s1 and s2 have 12 layers; coefficients[2] is the slope
fun <- function(x) { lm(x[1:12] ~ x[13:24])$coefficients[2] }
x1 <- calc(s, fun)

一个砖(或堆栈)中的值与“时间”的回归

time <- 1:nlayers(s)
fun <- function(x) { lm(x ~ time)$coefficients[2] }
x2 <- calc(s, fun)

获取多个层,例如斜率截距

fun <- function(x) { lm(x ~ time)$coefficients }
x3 <- calc(s, fun)

在某些情况下,更快(> 100 倍)的方法是直接使用线性代数并预先计算一些常数

# add 1 for a model with an intercept
X <- cbind(1, time)

# pre-computing constant part of least squares
invXtX <- solve(t(X) %*% X) %*% t(X)

## much reduced regression model; [2] is to get the slope
quickfun <- function(y) (invXtX %*% y)[2]
x4 <- calc(s, quickfun) 

【讨论】:

  • 如果这是一个菜鸟问题,我很抱歉,但如果您使用像素作为单独的观察值,它不会违反回归中的独立性假设吗?
  • 这取决于网格单元(像素)代表什么;以及该假设是否与您的案例实际相关。另外,您是否考虑层之间(对于单元)或单元之间(对于层)或两者的独立性?
猜你喜欢
  • 1970-01-01
  • 2020-03-27
  • 1970-01-01
  • 2017-11-13
  • 1970-01-01
  • 2013-12-21
  • 2022-08-24
  • 2015-05-27
  • 1970-01-01
相关资源
最近更新 更多