我想对表示Landsat数据的Band3和Band4的两个栅格堆栈的每个像素执行移动窗口回归。结果应该是两个额外的堆栈,一个表示拦截,另一个表示回归的斜率。 因此,堆栈“B3”和堆栈“B4”的第1层导致堆栈“拦截”的层1并堆叠“斜率”。堆栈B3的第2层和堆栈B4产生第2层......,依此类推。
我已经使用了gwr
函数,但希望保留在光栅包中。
我知道必须包含focal
才能设置我的移动窗口(应该是3x3像素),并且不知何故是一个线性模型,如:lm(as.matrix(b3)~as.matrix(b4))
,虽然我不认为这会让我获得价值逐像素...
也可以采用逐层方法代替rasterstack。 (所以它不一定是Band3的rasterstack。
有没有人在R中如何编程呢?
答案 0 :(得分:2)
这是一种改编自?raster :: 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]
)。