【发布时间】:2016-01-04 09:04:27
【问题描述】:
在过去的几天里,我在 R 中开发了多个 PLS 模型,用于光谱数据(波段作为解释变量)和各种植被参数(作为个体响应变量)。数据集总共包含 56 个。前 28 个(训练集)已用于模型校准,现在我要做的就是预测测试集中剩余 28 个观察值的响应值。然而,出于某种原因,R 继续返回给定数量的组件的校准集的拟合值,而不是独立测试集的预测。简而言之,模型如下所示。
# first simulate some data
set.seed(123)
bands=101
data <- data.frame(matrix(runif(56*bands),ncol=bands))
colnames(data) <- paste0(1:bands)
data$height <- rpois(56,10)
data$fbm <- rpois(56,10)
data$nitrogen <- rpois(56,10)
data$carbon <- rpois(56,10)
data$chl <- rpois(56,10)
data$ID <- 1:56
data <- as.data.frame(data)
caldata <- data[1:28,] # define model training set
valdata <- data[29:56,] # define model testing set
# define explanatory variables (x)
spectra <- caldata[,1:101]
# build PLS model using training data only
library(pls)
refl.pls <- plsr(height ~ spectra, data = caldata, ncomp = 10, validation =
"LOO", jackknife = TRUE)
然后确定由 3 个组件组成的模型在没有过度拟合的情况下产生了最佳性能。因此,以下命令用于使用上述校准的 3 个分量的 PLS 模型预测测试集中 28 个观测值的值:
predict(refl.pls, ncomp = 3, newdata = valdata)
虽然输出看起来很明智,但我很快发现,所有这段代码生成的都是 PLS 模型对校准/训练数据的拟合值,而不是预测。我发现了这一点,因为下面的代码,其中 newdata = 被省略,产生相同的结果。
predict(refl.pls, ncomp = 3)
肯定有什么地方出了问题,尽管我似乎无法找出具体是什么。有没有人可以并且愿意帮助我朝着正确的方向前进?
【问题讨论】:
-
请尽量让您的代码可重现,因为我们无权访问您的数据。
-
您确定
valdata的数据格式正确吗?拆分数据集后,您会进行大量数据转换(并且不要在任何地方使用 caldata 数据框)。正如 Pascal 所说,请让您的示例可重现。 -
我现在添加了一些数据模拟,希望这就足够了。我确实做了各种拆分,首先将训练与测试数据分开(按行)。然后我将 X 与 Y 变量(按列)分开,一个数据框包含所有光谱数据列 (X) 和各种数据框,每个数据框都包含一列响应变量 (Y)。在 PLS 模型构建的实际代码中,我指的是“spectra”,它实际上是指 caldata 数据框。我也指 HEIGHT,它也指 caldata 数据框。
-
我猜你的问题中不再需要
data <- read.table("CALVAL_FWHM30_indices+spectra.txt", header=TRUE) data <- as.data.frame(data)。此外,plsr函数将 data.frame 作为输入。您可能可以避免创建HEIGHT、FBM...等等 -
我可以以某种方式看到您试图到达的位置,但是如何在不调用整个数据帧的情况下调用 plsr 函数中数据帧中的光谱数据?我需要在 plsr 函数之前进行一些拆分,以将 X 与 Y 变量分开。
标签: r regression