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
...

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


person Leprechault    schedule 14.11.2018    source источник
comment
Вы хотите, чтобы ваш ответ был азот + углерод (или комбинация ответов), или вы хотите подогнать модель для углерода, модель для азота, а затем объединить результаты?   -  person Henry Cyranka    schedule 14.11.2018
comment
Харро мне нравится подбирать модель для углерода, модель для азота, а затем объединять результаты   -  person Leprechault    schedule 14.11.2018


Ответы (1)


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

  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

person Sergey Kucheryavskiy    schedule 27.11.2018