使用R中的PLS模型对象预测多波段栅格

时间:2015-03-09 12:14:57

标签: r

我在R中有一个偏最小二乘回归模型对象,我想用它来预测地图上的空间模式。

然而,到目前为止,这对我不起作用。 PLS模型在R(PLS包)中处理,输入是表格:

Dependent variable   Indepentent var. 1   Indepentend var ...     Indepented var. 101
Value                value                value                   value
Value                value                value                   value
...                  ...                  ...                     ...

所以我想根据地图上每个像素的101个独立变量来预测因变量的值。然而,PLS模型输入是表格,并且预测数据由具有101个带(层)的BSQ文件组成。因此,训练数据和预测数据的数据结构完全不同。

有人告诉我,我应该堆叠BSQ地图,之后我可以使用Predict功能。这不起作用。

如何以某种方式将BSQ文件中的101个波段强制转换为一个结构,我可以根据我的PLS模型对每个像素进行预测?请记住,当涉及到R时,我有点像新手。

library(raster)
library(rgdal)
library(maptools)
library(sp)
library(pls)


#   the dir and name of the plsr model object
modDir        <- "H:/Process"
modName       <- "Model"

#   the dir and type of the remote sensing image
rsDir         <- "H:/data"
rsName        <- "Hyper.bsq"

# Read the PLSR model
setwd("H:/Process")
# setwd(paste(modDir, modName, sep= "/"))
m             <- load(list.files()[grep("Model", list.files())]) 
mod           <- get(m)

# Read the RS image
setwd(rsDir)
rs            <- stack(rsName)


predict(mod, rs)

谢谢!阿伦德

1 个答案:

答案 0 :(得分:0)

rs的结构需要与用于拟合模型的数据结构完全相同。通常,拟合模型将使用(这使用示例数据):

library(plsr)
yarn.pls <- plsr(density ~ NIR, 6, data = yarn)

其中yarn[['NIR']]实际上是一个矩阵,其行数与整体data.frame的行数相同:

> str(yarn)
'data.frame':   28 obs. of  3 variables:
 $ NIR    : num [1:28, 1:268] 3.07 3.07 3.08 3.08 3.1 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : NULL
  .. ..$ : NULL
 $ density: num  100 80.2 79.5 60.8 60 ...
 $ train  : logi  TRUE TRUE TRUE TRUE TRUE TRUE ...

为了进行预测,您需要提供预测data.frame,该NIR也具有density变量(具有该名称),该变量实际上是具有相同数量的列的矩阵(即你的情况),和许多行。对于每一行,进行str的预测。

因此,请仔细查看您的训练数据(使用{{1}})并模拟预测。