如何在 R 中加载库以使用 bert-toolkit 从 Excel 调用它?

How can I load a library in R to call it from Excel with bert-toolkit?

Bert-toolkit 是一个非常好的包,可以从 Excel 调用 R 函数。参见:https://bert-toolkit.com/

我已经使用 bert-toolkit 在 Excel VBA 中的 R 包装函数中调用了一个拟合神经网络(avNNnet 拟合插入符号)。这运行完美。这是在 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 包)来做到这一点。虽然我没有成功。如果我从 Excel VBA 调用合适的 GAM,它会给出错误 2015。如果我从一个单元格调用合适的 GAM,它会给出 #VALUE!同时在bert-console中显示正确的计算结果!

这是在 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)
}

avNNnet 模型 (Caret) 和 GAM 模型 (mgcv) 之间的区别是 avNNnet 模型不需要加载 Caret 库来生成预测,而 GAM 模型需要要加载的 mgcv 库。

用 GAM 模型在脚本中加载 mgvc 库似乎不够,GAM 模型在 bert-toolkit 的包装函数中加载 GAM 模型,就像我在上面的代码中所做的那样。 尽管模型的正确结果显示在 bert-console 中。它不会在 Excel. 中生成正确的结果 我想知道这怎么可能并且可以解决。在我看来,在 bert-toolkit.

中可能有两个 R 运行 实例

如何加载 mgcv 库,以便 GAM 模型在从 Excel 调用的函数中使用它? 这是一些使用 mgcv 拟合 GAM 并保存到模型的示例代码(在 运行 此代码之后,模型可以使用上面的代码上传到 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")

R 的签名之一是 method dispatching,其中用户调用相同的命名方法,例如 predict,但内部不同的变体是 运行,例如 predict.lmpredict.glmpredict.gam 取决于传递给它的模型对象。因此,在 avNNet 模型上调用 predict 与在 gam 模型上调用 predict 不同。类似地,正如函数因 输入 而改变一样, 输出 也会改变。

根据有关 Excel #Value! error exposed as Error 2015 的 MSDN 文档:

#VALUE is Excel's way of saying, "There's something wrong with the way your formula is typed. Or, there's something wrong with the cells you are referencing."

从根本上说,在没有看到实际结果的情况下,Excel 可能无法解释或翻译成 Excel 范围或 VBA 从 gam 模型,尤其是你描述的 R 没有错误。

例如,根据 docs,标准 predict.lm 的 return 值为:

predict.lm produces a vector of predictions or a matrix of predictions...

然而,根据 docspredict.gam 的 return 值有点细微差别:

If type=="lpmatrix" then a matrix is returned which will give a vector of linear predictor values (minus any offest) at the supplied covariate values, when applied to the model coefficient vector. Otherwise, if se.fit is TRUE then a 2 item list is returned with items (both arrays) fit and se.fit containing predictions and associated standard error estimates, otherwise an array of predictions is returned. The dimensions of the returned arrays depends on whether type is "terms" or not: if it is then the array is 2 dimensional with each term in the linear predictor separate, otherwise the array is 1 dimensional and contains the linear predictor/predicted values (or corresponding s.e.s). The linear predictor returned termwise will not include the offset or the intercept.

总而言之,考虑调整 predict 调用的参数以呈现数字向量以便于 Excel 解释,而不是 matrix/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
}
...

进一步诊断:

  • str(obj)class(obj)/typeof(obj) 检查 predict.glm 的 returned 对象以查看尺寸和底层元素并与 [=11= 进行比较] 在 caret;
  • 检查是否是小数精度高的情况,例如Excel限制15位小数;
  • 检查数据量 returned(超过 Excel 的 sheet 行限制 220 或单元格限制 32,767 个字符?)。