Moving window regression

笑着哭i 提交于 2019-12-30 07:52:29

问题


I want to perform a moving window regression on every pixel of two raster stacks representing Band3 and Band4 of Landsat data. The result should be two additional stacks, one representing the Intercept and the other one representing the slope of the regression. So layer 1 of stack "B3" and stack "B4" result in layer 1 of stack "intercept" and stack "slope". Layer 2 of stack B3 and stack B4 result in layer 2,.... and so on.

I already came along the gwrfunction, but want to stay in the raster package. I somehow know that focal must be included in order to set my moving window (which should be 3x3 pixels) and somehow a linear model like: lm(as.matrix(b3)~as.matrix(b4)) although I don't think that this gets me the values pixelwise...

Instead of a rasterstack a layer by layer approach is also possible. (So it must not necessarily be a rasterstack of Band3.

Has anyone a glue how to program this in R?


回答1:


Here is one approach, adapted from ?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)

Unfortunately you will have to run this twice to get both the slope and intercept (coefficients(m)[1]).



来源:https://stackoverflow.com/questions/30379604/moving-window-regression

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!