我正在尝试使用glm
模型,其中y, x1 + x2....xn
是rasterStack
对象中的图层。我已经尝试将栅格堆栈转换为dataframe
对象,但是我得到了矢量大小错误,如下所示。相反,我想尝试使用栅格图层作为输入来拟合回归模型 - 在给定文件大小和内存错误的情况下,无需将图层转换为数据框。这是可能的,你会如何配置?
我想要拟合的模型是自然的: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
答案 0 :(得分:2)
以下是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)
使用&#39; time&#39;
在一个砖块(或堆栈)中回归值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)