我正在使用該函式raster::predict將線性模型的預測部分提取為柵格,但出現此錯誤:
Error in model.frame.default(Terms, newdata, na.action = na.action, xlev = object$xlevels) : object is not a matrix
In addition: Warning message:
'newdata' had 622 rows but variables found have 91 rows
我的資料集是RasterStack兩個衛星影像(相同的 CRS 和資料型別)。我找到了這個問題,但我無法解決我的問題。這是代碼和資料:
library(raster)
ntl = raster ("path/ntl.tif")
vals_ntl <- as.data.frame(values(ntl))
ntl_coords = as.data.frame(xyFromCell(ntl, 1:ncell(ntl)))
combine <- as.data.frame(cbind(ntl_coords,vals_ntl))
ebbi = raster ("path/ebbi.tif")
ebbi <- resample(ebbi, ntl, method = "bilinear")
vals_ebbi <- as.data.frame(values(ebbi))
s = stack(ntl, ebbi)
block.data <- as.data.frame(cbind(combine, vals_ebbi))
names(block.data)[3] <- "ntl"
names(block.data)[4] <- "ebbi"
block.data <- na.omit(block.data)
model <- lm(formula = ntl ~ ebbi, data = block.data)
#predict to a raster
r1 <- raster::predict(s, model, progress = 'text', na.rm = T)
plot(r1)
writeRaster(r1, filename = "path/lm_predict.tif")
可以從這里下載資料(我不知道通過共享較小的資料集是否仍然存在問題,所以我決定共享完整的資料集,使用dput命令復制粘貼時相當大)
uj5u.com熱心網友回復:
您是對的,這dput通常對空間資料不是很有用;并且您應該避免使用它。但是,在大多數情況下,無需共享資料,因為您可以使用代碼或 R 附帶的資料創建示例資料,就像本網站上幫助檔案和問題中的大多數示例一樣。說“我不知道通過共享較小的資料集是否仍然存在問題”表明您應該做的第一件事就是找出答案。
如果您有x想要復制的 SpatRaster,您可以從 開始as.character(x),這就是我為獲得以下內容所做的。
library(terra)
ntl <- rast(ncols=48, nrows=91, nlyrs=1, xmin=582360, xmax=604440, ymin=1005560, ymax=1047420, names=c('avg_rad'), crs='EPSG:7767')
ebbi <- rast(ncols=48, nrows=91, nlyrs=1, xmin=582360, xmax=604440, ymin=1005560, ymax=1047420, names=c('B6_median'), crs='EPSG:7767')
values(ntl) <- sample(100, ncell(ntl), replace=TRUE)
values(ebbi) <- runif(ncell(ebbi))
組合、設定名稱并將值放入 data.frame。對于較大的資料集,您可以使用spatSample(x, type="regular").
x <- c(ntl, ebbi)
names(x) <- c("ntl", "ebbi")
適合模型。您可以分兩步完成
v <- as.data.frame(x, na.rm=TRUE)
model <- lm(ntl ~ ebbi, data=v)
或者一步到位
model <- lm(ntl ~ ebbi, data=x)
現在進行預測(如果要將柵格保存到磁盤,請設定檔案名)。
p <- predict(x$ebbi, model, filename="")
重要的是,第一個 (SpatRaster) 引數predict的名稱與模型中的名稱相匹配。所以在這種情況下你可以使用x$ebbior x[[2]],但是如果你使用ebbi你會得到一個神秘的錯誤資訊
p <- predict(ebbi, model)
#Error in model.frame.default(Terms, newdata, na.action = na.action, xlev = object$xlevels) : object is not a matrix
#In addition: Warning message:
#'newdata' had 48 rows but variables found have 91 rows
除非你先做
names(ebbi) <- "ebbi"
p <- predict(ebbi, model)
uj5u.com熱心網友回復:
或者,使用該raster軟體包的解決方案是:
library(raster)
ntl = raster ("path/ntl.tif")
ebbi = raster ("path/ebbi.tif")
ebbi <- resample(ebbi, ntl, method = "bilinear")
s = stack(ntl, ebbi)
names(s) = c('ntl', 'ebbi') # important step in order to run the predict function successfully
block.data = data.frame(na.omit(values(s)))
names(block.data) <- c('ntl', 'ebbi')
model <- lm(formula = ntl ~ ebbi, data = block.data)
#predict to a raster
r1 <- raster::predict(s, model, progress = 'text', na.rm = T)
plot(r1)
writeRaster(r1, filename = "path/lm_predict.tif")
我根據這篇文章找到了答案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/515288.html
標籤:r线性回归光栅预言
