来自拟合良好的 GAM 模型的奇怪预测

问题描述 投票:0回答:1

我正在根据 Sentinel-2 植被指数对生物量 (AGB) 进行建模,并通过现场测量进行校准。 特征选择后,选择以下波段和指数:GNDVI、B2、LAI、STVI2 由于 AGB 数据和所有正值的正确偏度,我使用 Gamma(link='inverse') 系列函数成功拟合了一个良好的 GAM 模型。 数据:

library(mgcv) #for gam modeling
library(Metrics) #for prediction validation
set.seed(2)  # For reproducibility
**# split into train- en test dataset**
train_ind <- sample(1:nrow(data_gams), 0.9 * nrow(data_gams))
gams_train <- data_gams[train_ind, ]
gams_test<- data_gams[-train_ind, ]
**# model**
model<- gam(AGB~s(GNDVI)+s(B2)+s(LAI)+s(STVI2), data=gams_train, family=Gamma("inverse"))
summary(model)
gam.check(model)
plot.gam(model, pages=1)
**# predict & validate**
pred<- predict.gam(model, newdata = gams_test)
rmse <- rmse(pred, gams_test$AGB)
rmse
mae<-  mae(pred, gams_test$AGB)
mae
plot(pred, gams_test$AGB)

R² 和 R²adj 很好(~70%),并且图看起来没有过度拟合。拟合的部分曲线和拟合值看起来很合理。然而,rmse 和 mae 值非常高。预测的 AGB 值非常低(0.001-0.05,有时为负值!),而所有测量的 AGB 均为 18-140。该数据集只有 49 个观测值,因此相当低,但预测无论如何都不符合逻辑。

我尝试了不同的测试和训练数据集,所有这些都产生了类似的预测。我比较了测试数据集的 VI 值,其范围与部分图上的训练集值的范围相同。我标准化了数据集并尝试了留一法交叉验证以使模型更加稳健。 我不明白这个预测出了什么问题。

model prediction gam sentinel2
1个回答
0
投票

我怀疑您需要在对

type = 'response'
的通话中使用
predict.gam()
。默认行为是返回链接比例的预测(有关更多详细信息,请参阅
?predict.gam

© www.soinside.com 2019 - 2024. All rights reserved.