PLS в R: моделирование обучения и прогнозирования значений с двумя переменными Y

Мне нравится моделировать обучение и прогнозировать значения, используя модель PLS для более чем одной переменной Y, но у меня есть некоторые проблемы, когда я пробую этот подход, в моем коде ниже:

#First simulate some data
set.seed(123)
bands=20
data <- data.frame(matrix(runif(60*bands),ncol=bands))
colnames(data) <- paste0(1:bands)
data$nitrogen <- rpois(60,10)
data$carbon <- rpois(60,10)
#

#Tranning data set
cal_BD<-data[1:50,]

#Validation data set
val_BD<-data[51:60,]

# define explanatory variables (x)
spectra <- cal_BD[,1:20]

#Build PLS model using training data only
mod_pls <- plsr(carbon + nitrogen ~ spectra,
ncomp = 20, data =cal_BD, validation = "LOO", jackknife = TRUE)
summary(mod_pls)
#

#Prediction in validation data set
est_pls<-predict(mod_pls, comps = 20, newdata = val_BD)
est_pls
#

1) не работает, когда я пробую углерод + азот в модели; а также

2) Я хотел бы создать новый фрейм данных с оценочными значениями для углерода и азота, используя код ниже:

val_BD2<-val_BD[,-(21:22)] # remove carbon + nitrogen beccause my goal is predict this values
est_pls<-predict(mod_pls, comps = 20, newdata = val_BD)#Prediction in validation data set (only X's)
final_est_DF<-cbind(val_BD2est_pls[,1],est_pls[,2])

И мой желаемый результат с оценкой углерода и азота и ненаблюдаемых значений:

            1          2         3  ... carbon  nitrogen
51 0.04583117 0.93529980 0.6299731  ... 15.3     8.6
52 0.44220007 0.30122890 0.1838285  ... 10.0     7.1
53 0.79892485 0.06072057 0.8636441  ...  9.0     7.3
54 0.12189926 0.94772694 0.7465680  ... 11.1     6.5
55 0.56094798 0.72059627 0.6682846  ... 10.3     8.4
56 0.20653139 0.14229430 0.6180179  ... 13.9     9.1
...

Это возможно?

1 ответ

Вы можете либо использовать две отдельные PLS-модели, чтобы делать прогнозы и комбинировать результаты в один фрейм данных вручную, либо создать одну (PLS2) модель для обоих предикторов. Второе имеет смысл, только если переменные ответа коррелированы. Похоже, что нет прямой опции для регрессии PLS2 в plsr пакет. Ты можешь попробовать:

  1. Вызов simpls.fit метод напрямую (хотя авторы не рекомендуют это). См. Например: https://www.rdocumentation.org/packages/pls/versions/2.7-0/topics/simpls.fit. В этом случае вы можете указать Y как матрицу или фрейм данных с двумя столбцами.

  2. Используйте другой пакет с PLS2, например, https://www.rdocumentation.org/packages/plspm/versions/0.2-2/topics/plsreg2

Другие вопросы по тегам