R 如何在PMML中执行koyck滞后转换?
我使用PMML在不同平台之间传输我的模型(我在R中开发)。我经常面临的一个问题是,给定输入数据,我需要进行大量的预处理。大多数情况下,这在PMML中相当简单,但当我需要Koyck滞后转换时,我无法弄清楚如何进行。现在,输入数据集的前几行如下所示:R 如何在PMML中执行koyck滞后转换?,r,data-processing,pmml,R,Data Processing,Pmml,我使用PMML在不同平台之间传输我的模型(我在R中开发)。我经常面临的一个问题是,给定输入数据,我需要进行大量的预处理。大多数情况下,这在PMML中相当简单,但当我需要Koyck滞后转换时,我无法弄清楚如何进行。现在,输入数据集的前几行如下所示: Y Z S Xa Xb Xc 1 11.37738 1 0.8414710 0.0 0.0 581102.6 2 21.29848 2 0.9092974 700
Y Z S Xa Xb Xc
1 11.37738 1 0.8414710 0.0 0.0 581102.6
2 21.29848 2 0.9092974 700254.1 0.0 35695.1
3 14.30348 3 0.1411200 0.0 384556.3 0.0
4 18.07305 4 0.0000000 413643.2 0.0 0.0
5 29.02756 5 0.0000000 604453.3 0.0 350888.2
6 20.73336 6 0.0000000 0.0 0.0 168961.2
lagIt<-function (x, d, ia = mean(x))
{
y <- x
y[1] <- y[1] + ia*d
for (i in 2:length(x)) y[i] <- y[i] + y[i-1] * d
y
}
df2<-transform(df, M=(lagIt(tanh(Xa/300000), 0.5) +
lagIt(tanh(Xb/100000), 0.7) + lagIt(tanh(Xc/400000), 0.3)))
> head(df2)
# Y Z S Xa Xb Xc M
# 1 11.37738 1 0.8414710 0.0 0.0 581102.6 1.460318
# 2 21.29848 2 0.9092974 700254.1 0.0 35695.1 1.637388
# 3 14.30348 3 0.1411200 0.0 384556.3 0.0 1.767136
# 4 18.07305 4 0.0000000 413643.2 0.0 0.0 1.960151
# 5 29.02756 5 0.0000000 604453.3 0.0 350888.2 2.796750
# 6 20.73336 6 0.0000000 0.0 0.0 168961.2 1.761774
并由以下内容生成:
df<-structure(list(Y = c(11.3773828021943, 21.2984762226498, 14.3034834956969,
18.0730530464578, 29.0275566937015, 20.7333617643781, 30.9707039948106,
30.2428379202751, 22.1677291047936, 19.7450403054104, 18.4642890388219,
28.4145184014117, 28.5224574661743, 40.5073319897728, 40.8853498146471,
20.7173713186907, 35.8080372291603, 37.6213598048788, 38.3123458040493,
25.143519382411),
Z = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20),
S = c(0.841470984807897, 0.909297426825682, 0.141120008059867,
0, 0, 0, 0.656986598718789, 0.989358246623382,
0.412118485241757, 0, 0, 0, 0.420167036826641, 0.99060735569487,
0.650287840157117, 0, 0, 0, 0.149877209662952, 0.912945250727628),
Xa = c(0, 700254.133201206, 0, 413643.212229974, 604453.339408554,
0, 623209.174415675, 1042574.05046884, 0, 0, 397257.053501325,
441408.09060313, 0, 0, 597980.888163467, 0, 121672.230528635,
199542.274825303, 447951.083632432, 84751.5842557032),
Xb = c(0, 0, 384556.309344495, 0, 0, 0, 0, 0, 0, 0, 0,
179488.805498654, 31956.7161910341, 785611.676606721,
65452.7295721654, 0, 231214.563631705, 0, 0,
176249.685091327),
Xc = c(581102.615208462, 35695.0974169599, 0, 0, 350888.245086195,
168961.239749307, 458076.400377529, 218707.589596171,
0, 506676.223324812, 0, 25613.8139087091, 429615.016105429,
410675.885159107, 0, 229898.803944166, 2727.64268459058,
711726.797796325, 354985.810664457, 0)),
.Names = c("Y", "Z", "S", "Xa", "Xb", "Xc"),
row.names = c(NA, -20L),
class = "data.frame")
但是,我想包括变量M创建的一部分。如何编写符合PMML的部分?同样,输入数据是df data.frame,我希望所有数据的预处理都在PMML中定义 PMML对单值数据记录进行操作,但您尝试使用向量值数据记录。最肯定的是,您不能在PMML中执行(for-)循环 根据您的部署平台,您可能能够使用扩展功能。基本上,这包括1)编程Koyck滞后转换,2)将其转换为独立的扩展库,以及3)使PMML引擎了解此扩展库。与所有其他内置函数和用户定义函数一样,可以按名称调用此扩展函数
使用JPMML库应该可以执行上述操作。我也这么怀疑。我希望在PMML标准中有一些我没有发现的特性。我将看看JPMML库,看看是否可以创建该函数。
fit<-lm(Y~Z+S+M, data=df2)
library(pmml)
pmml(fit)