簡體   English   中英

光柵圖像上的線性回歸-LM抱怨NA

[英]Linear regression on raster images - lm complains about NAs

我敢肯定,可以用幾個字節來解決這個問題,但是我已經花了幾個小時來處理這個簡單的事情,並且無法擺脫。 我不經常使用R。

我有5個asciigrid文件,它們代表5個光柵圖像。 一些像素確實具有值,其他像素確實具有NA。 例如,第一個圖像可能類似於:

NA  NA  NA  NA  NA
NA  NA  2   3   NA
NA  0.2 0.3 1   NA
NA  NA  4   NA  NA

第二個可能是:

NA  NA  NA  NA  NA
NA  NA  5   1   NA
NA  0.1 12  12  NA
NA  NA  6   NA  NA

如您所見,NA的位置始終是相同的,對此我100%確信。 我願意做的是:

  • 使用read.asciigrid()讀取文件;
  • 使用raster包中的values()在長數組中獲取它們的值;
  • 創建一個包含5行的矩陣,每行均包含相應地圖的值;
  • 線性擬合每列並獲得系數。 每列將代表一個像素,並將具有對應於5個貼圖的5個值。
  • 用系數值創建兩個新的光柵圖像。

我陷在lm 具體來說,它說: Error in lm.fit(...): 0 (non-NA) cases 但是,據我對歸因圖的了解,應該是具有所有 NA的列或根本沒有 NA的列,如下所示:

NA   NA   NA   NA   0.2  2    NA  ... (lots of other columns)
NA   NA   NA   NA   2    2.1  NA
NA   NA   NA   NA   3    0.5  NA
NA   NA   NA   NA   12   6    NA
NA   NA   NA   NA   0.4  2    NA

我希望輸出是:

NA   NA   NA   NA   ..   ..   NA

因此我可以使用系數創建新的光柵圖像並保持NA位置。 我哪里錯了? 在下面粘貼我的代碼。 謝謝。

library(sp)
library(raster)
library(fields)
names = c('...','...','...','...','...')
x = c(10,20,30,40,50)
x = log(x)
y = vector('list',length=length(x))
rasters = vector('list',length=length(x))
for (name in names) {
  ind = which(name == names)
  rasters[ind] = read.asciigrid(name)
  rasters[ind] = raster(rasters[[ind]])
  y[[ind]] = values(rasters[[ind]])
}

y = t(simplify2array(y))
lModel = lm(y ~ x) // Error here!

這是str(y)的輸出:

num [1:5,1:1260630]不適用不適用不適用不適用不適用不適用不適用...(有時會有數字)

編輯

感謝@RobertH,我了解了raster::stackraster::calc 我努力了:

x <- log(c(10,20,30,40,50))
fun <- function(y) { lm(y ~ x)$coefficients }
r <- calc(s, fun)

變得晦澀難懂Cannot use this function.calcTest調用上Cannot use this function 我看着raster:::.calcTest沒有成功。 我嘗試管理所有y值均為NA ,如下所示:

fun = function(y) { 
  if (any(!is.na(y))) { 
    lm(y ~ x)$coefficients
  } else { 
    NA
  }
}
r <- calc(s,fun)

現在它可以工作幾分鍾,但是我Error in setValues(out, x) : values must be numeric, integer, logical or factor遇到Error in setValues(out, x) : values must be numeric, integer, logical or factor 但是,通常將NA設置為柵格值! 我看不到這里有什么問題。

這就是獲取柵格數據的方法

library(raster)
names = c('...','...','...','...','...')
s <- stack(names)
y <- values(s)

您現在可以執行類似的操作。

x <- log(c(10,20,30,40,50))
# need to exclude the rows that are all NA
i <- rowSums(is.na(y)) < ncol(y)
coef <- apply(y[i, ], 1, function(y) lm(y ~ x)$coefficients)
aa <- matrix(NA, ncol=2, nrow=length(i))
aa[i, ] <- coef
b <- brick(s, nl=2)
values(b) <- aa

但是您不需要這樣做。 為了做這樣的回歸,我會做

fun <- function(y) { lm(y ~ x)$coefficients }
r <- calc(s, fun)

但是,由於您的單元格(各層之間)僅具有NA值,因此將失敗(如上述應用中所述)。 您需要編寫一個函數來捕獲以下情況:

funa <- function(y) { 
    if(all(is.na(y))) {
        c(NA, NA)
    } else {
        lm(y ~ x)$coefficients 
    }
}
r <- calc(s, funa)

或更快的方法

X <- cbind(1, y)
invXtX <- solve(t(X) %*% X) %*% t(X)
quickfun <- function(i) (invXtX %*% i)
m <- calc(s, quickfun) 
names(m) <- c('intercept', 'slope')

參見?raster :: calc

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM