2015-05-21 67 views
0

我想对代表Landsat数据的Band3和Band4的两个栅格堆栈的每个像素执行移动窗口回归。结果应该是两个额外的堆栈,一个代表拦截,另一个代表回归的斜率。 因此,堆栈“B3”和堆栈“B4”的层1导致堆栈“截取”的层1和堆栈“斜率”。堆栈B3和堆栈B4的第2层产生第2层....等等。移动窗口回归

我已经沿着gwr函数来过,但是想留在光栅包中。 我莫名其妙地知道focal必须包括以设置我的移动窗口(这应该是3×3像素),并以某种方式线性模型,如:lm(as.matrix(b3)~as.matrix(b4))虽然我不认为这让我的价值观基于像素...

而不是一个rasterstack一层一层的方法也是可能的。 (因此,它不一定必须BAND3的rasterstack。

有没有人胶水如何R中设定此?

回答

2

这里是一个办法,改编自?光栅:: localFun

set.seed(0) 
b <- stack(system.file("external/rlogo.grd", package="raster")) 
x <- flip(b[[2]], 'y') + runif(ncell(b)) 
y <- b[[1]] + runif(ncell(b)) 

# local regression: 
rfun <- function(x, y, ...) { 
    d <- na.omit(data.frame(x, y)) 
    if (nrow(d) < 3) return(NA) 
    m <- lm(y~x, data=d) 
    # return slope 
    coefficients(m)[2] 
} 

ff <- localFun(x, y, fun=rfun) 
plot(ff) 

不幸的是,你需要运行这两次才能得到斜率和截距(coefficients(m)[1]

+1

将'ngb'设置为3行和3列时,用户交叉点(即9个单元格)在你的情况下, ngb = 3'或'ngb = c(3,3)'。 – RobertH

+0

Thanks Robert! - I wo我还有一个问题:因为我的实际B3和B4栅格堆栈包含NA值(它们在层中变化,但是在栅格之间的相同位置上--B3的层1与B4中的层1具有相同的NA位置)。我认为这不应该通过'm < - lm(x〜y,na.action = na.exclude)'出现任何问题,但它给了我下面的错误:'lm.fit错误(x,y,offset = offset ,singular.ok = singular.ok,...): 0(非NA)的情况 调用自:eval(替代(浏览器(skipCalls = pos),列表(pos = 9-帧)), envir = sys.frame(frame))' – user2978751

+0

有一半以上的光栅通常是NA。我认为它不是执行移动窗口回归的最佳条件 - 我想这应该是可能的。 – user2978751