Как я могу загрузить библиотеку в R для вызова из Excel с помощью bert-toolkit? - PullRequest
3 голосов
/ 06 марта 2020

Bert-toolkit - очень хороший пакет для вызова функций R из Excel. См .: https://bert-toolkit.com/

Я использовал набор инструментов bert для вызова встроенного нейра lnet (avN Nnet с кареткой) в функции оболочки в R из Excel VBA. Это работает отлично. Это код для загрузки модели в функции оболочки в bert-toolkit:

    load("D:/my_model_avNNet.rda")

    neuraln <- function(x1,x2,x3){
    xx <- data.frame(x1,x2,x3)
    z <- predict(my_model_avNNET, xx)
    z
}

В настоящее время я пытался сделать это с помощью встроенного GAM (с пакетом mgcv). Хотя у меня ничего не получится. Если я вызываю установленную GAM из Excel VBA, это дает ошибку 2015. Если я вызываю установленную GAM из ячейки, это дает #VALUE! В то же время правильный результат расчета показан в консоли bert!

Это код для загрузки модели в функцию оболочки в bert-toolkit:

library(mgcv)
load("D:/gam_y_model.rda")

testfunction <- function(k1,k2){
  z <- predict(gam_y, data.frame(x = k1, x2 = k2))
  print (z)
}

Разница между avN Nnet -моделью (Caret) и GAM-моделью (mgcv) заключается в том, что avN Nnet -model НЕ требуется загрузка библиотеки Caret для генерации прогноза, в то время как GAM-модель НЕ ДОЛЖНА загружаемая библиотека mgcv.

Кажется, что недостаточно загрузить библиотеку mgv c в сценарии с помощью GAM-модели, которая загружает GAM-модель в функцию-обертку в bert-toolkit , как я сделал в коде выше. Хотя правильный вывод модели показан на консоли bert. Это не дает правильного результата в Excel. Интересно, как это возможно и может быть решено. Мне кажется, что, может быть, в bert-toolkit есть два экземпляра R.

Как загрузить библиотеку mgcv таким образом, чтобы она могла использоваться GAM-моделью в функции вызывается из Excel? Ниже приведен пример кода для подгонки GAM с mgcv и сохранения в модель (после запуска этого кода модель можно загрузить в bert-toolkit с кодом выше):

library(mgcv)

# construct some sample data:
x <- seq(0, pi * 2, 0.1)
x2 <- seq(0, pi * 20, 1)
sin_x <- sin(x)
tan_x2 <- tan(x2)
y <- sin_x + rnorm(n = length(x), mean = 0, sd = sd(sin_x / 2))
Sample_data <- data.frame(y,x,x2)

# fit gam:
gam_y <- gam(y ~ s(x) + s(x2), method = "REML")

# Make predictions with the fitted model:
  x_new <- seq(0, max(x), length.out = 100)
  x2_new <- seq(0, max(x2), length.out = 100)
y_pred <- predict(gam_y, data.frame(x = x_new, x2 = x2_new))

# save model, to load it later in bert-toolkit:
setwd("D:/")
save(gam_y, file = "gam_y_model.rda")

1 Ответ

1 голос
/ 15 марта 2020

Одной из подписей R является метод отправки , когда пользователи вызывают один и тот же именованный метод, такой как predict, но внутренне запускается другой вариант, такой как predict.lm, predict.glm или predict.gam в зависимости от на объекте модели передается в него. Следовательно, вызов predict для модели av NNet не совпадает с predict для модели gam . Точно так же, как функция изменяется из-за ввода , изменяется и вывод .

В соответствии с документами MSDN, касающимися Excel #Value! ошибка выставлена ​​как Ошибка 2015 :

#VALUE - это способ Excel сказать, "Что-то не так с тем, как набирается ваша формула. Или есть что-то не так с ячейками, на которые вы ссылаетесь. "

По сути, Excel не может интерпретировать или переводить в диапазон Excel или тип VBA, который R возвращает из *, не видя реальных результатов. Модель 1033 * gam , особенно, как вы описываете, R не вызывает ошибок.

Например, для документов возвращаемое значение стандарта predict.lm равно:

predict.lm создает вектор предсказаний или матрицы предсказаний ...

Однако для документов возвращаемое значение predict.gam немного более нюансировано:

Если type=="lpmatrix", то возвращается матрица, которая даст вектор значений линейного предиктора (минус любое отклонение) при заданных ковариатных значениях применительно к вектору коэффициентов модели. В противном случае, если se.fit равно TRUE, то возвращается список из 2 элементов с элементами (оба массива) fit и se.fit, содержащими прогнозы и соответствующие стандартные оценки ошибок, в противном случае возвращается массив прогнозов. Размеры возвращаемых массивов зависят от того, является ли type "terms" или нет: если это так, то массив является двухмерным с каждым членом в линейном предикторе отдельно, в противном случае массив является одномерным и содержит линейный предиктор / прогнозируемый значения (или соответствующие ses). Линейный предиктор, возвращаемый поочередно, не будет включать смещение или точку пересечения.

В общем, рассмотрите возможность настройки параметров вашего вызова predict для отображения вектора чисел c для простой интерпретации Excel, а не для матрицы / array или другой тип R более высокого измерения, который Excel не может отобразить:

testfunction <- function(k1,k2){
  z <- mgcv::predict.gam(gam_y, data.frame(x = k1, x2 = k2), type=="response")
  return(z)
}

testfunction <- function(k1,k2){
  z <- mgcv::predict.gam(gam_y, data.frame(x = k1, x2 = k2), type=="lpmatrix")
  return(z)
}

testfunction <- function(k1,k2){
  z <- mgcv::predict.gam(gam_y, data.frame(x = k1, x2 = k2), type=="linked")
  return(z$fit)   # NOTICE fit ELEMENT USED
}
...

Дальнейшая диагностика:

  • Проверка возвращенного объекта predict.glm с помощью str(obj) и class(obj) / typeof(obj) для просмотра размеров и базовых элементов и сравнения с predict в caret;
  • Проверьте, соответствует ли высокая точность десятичных чисел, например, пределы Excel в 15 десятичных точек;
  • Проверить количество возвращаемых данных (превышает предел строки в Excel, равный 2 20 или предел ячейки 32 767 символов?).
...