R 逐像素回归提取残差

R 逐像素回归提取残差,r,raster,lm,R,Raster,Lm,我正在尝试从NDVI/降水的光栅堆栈上逐像素运行的回归中提取残差。当我使用一小部分数据运行脚本时,它就会工作。但是当我试着运行我的整个研究区域时,我得到:“setValues(out,x)中的错误:值必须是数字、整数、逻辑或因子” lm有效,因为我可以提取斜率和截距。我就是提取不出残差 你知道怎么解决这个问题吗 这是我的剧本: setwd("F:/working folder/test") gimms <- list.files(pattern="*ndvi.tif") ndvi <

我正在尝试从NDVI/降水的光栅堆栈上逐像素运行的回归中提取残差。当我使用一小部分数据运行脚本时,它就会工作。但是当我试着运行我的整个研究区域时,我得到:“setValues(out,x)中的错误:值必须是数字、整数、逻辑或因子”

lm有效,因为我可以提取斜率和截距。我就是提取不出残差

你知道怎么解决这个问题吗

这是我的剧本:

setwd("F:/working folder/test")
gimms <- list.files(pattern="*ndvi.tif")
ndvi <- stack(gimms)
precip <- list.files(pattern="*pre.tif")
pre <- stack(precip)
s <- stack(ndvi,pre)

residualfun = function(x) { if (is.na(x[1])){ NA } else { m <- lm(x[1:6] ~ x[7:12], na.action=na.exclude)
r <- residuals.lm(m)
return (r)}}

res <- calc(s,residualfun)
setwd(“F:/working folder/test”)

gimms仅当第一层显示
NA
值时才测试函数,以避免拟合模型。但在其他层中可能存在
NA
。您知道这一点,因为您在
lm
fit中添加了
na.action=na.exclude

问题是,如果模型因为NA而删除了一些值,那么残差将只具有非NA值的长度。这意味着您得到的
r
向量将根据层中
NA
值的数量具有不同的长度。然后,
calc
无法将堆栈中不同长度的结果与定义数量的层组合起来。
为了避免这种情况,您需要在函数中指定
r
的长度,并将残差仅属性为非NA值。
我建议使用下面的函数,它现在可以在您提供的数据集上工作。我添加了(1)如果您想扩展您的探索(使用
nlayers
),则可以比较每个层的更多层,(2)如果每个层中只有两个值可比较,则避免拟合模型(完美模型),(3)添加了
try
,如果出于任何原因模型可以拟合,这将输出
-1e32
的值,便于进一步测试

library(raster)
setwd("/mnt/Data/Stackoverflow/test")
gimms <- list.files(pattern="*ndvi.tif")
ndvi <- stack(gimms)
precip <- list.files(pattern="*pre.tif")
pre <- stack(precip)
s <- stack(ndvi,pre)

# Number of layers of each
nlayers <- 6

residualfun <- function(x) {
  r <- rep(NA, nlayers)
  obs <- x[1:nlayers]
  cov <- x[nlayers + 1:nlayers]
    # Remove NA values before model
    x.nona <- which(!is.na(obs) & !is.na(cov))
    # If more than 2 points proceed to lm
    if (length(x.nona) > 2) {
      m <- NA
      try(m <- lm(obs[x.nona] ~ cov[x.nona]))
      # If model worked, calculate residuals
      if (is(m)[1] == "lm") {
        r[x.nona] <- residuals.lm(m)
      } else {
        # alternate value to find where model did not work
        r[x.nona] <- -1e32
      }
    }
return(r)
}

res <- calc(s, residualfun)
库(光栅)
setwd(“/mnt/Data/Stackoverflow/test”)

嗯,也许你的公式论证有问题?我会显式地调用列。指向数据的链接已过时。