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

Мне нравится моделировать тренировки и прогнозировать значения, используя модель 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 Ответ

0 голосов
/ 27 ноября 2018

Вы можете использовать две отдельные модели 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

...