从R的poly()函数中提取正交多项式系数?

Gil*_*ead 15 r

R poly()函数产生用于数据拟合的正交多项式.但是,我想使用R之外的回归结果(比如在C++中),并且似乎没有办法获得每个正交多项式的系数.

注1:我不是指回归系数,而是正交多项式本身的系数),例如p_i(x)in

y = a0 + a1*p_1(x) + a2*p_2(x) + ...
Run Code Online (Sandbox Code Playgroud)

注2:我知道poly(x, n, raw=T)强制多边形来返回非正交多项式,但我想对正交多项式进行回归,这就是我正在寻找的东西.

jos*_*ber 21

使用您创建的对象的系数alphanorm2系数递归定义多项式poly.我们来看一个例子:

z <- poly(1:10, 3)
attributes(z)$coefs
# $alpha
# [1] 5.5 5.5 5.5
# $norm2
# [1]    1.0   10.0   82.5  528.0 3088.8
Run Code Online (Sandbox Code Playgroud)

对于符号,我们称之为a_d索引元素dalpha和我们称之为n_d元素索引dnorm2.F_d(x)d是生成的正交多项式.对于一些基本情况,我们有:

F_0(x) = 1 / sqrt(n_2)
F_1(x) = (x-a_1) / sqrt(n_3)
Run Code Online (Sandbox Code Playgroud)

其余的多项式是递归定义的:

F_d(x) = [(x-a_d) * sqrt(n_{d+1}) * F_{d-1}(x) - n_{d+1} / sqrt(n_d) * F_{d-2}(x)] / sqrt(n_{d+2})
Run Code Online (Sandbox Code Playgroud)

确认x=2.1:

x <- 2.1
predict(z, newdata=x)
#               1         2         3
# [1,] -0.3743277 0.1440493 0.1890351
# ...

a <- attributes(z)$coefs$alpha
n <- attributes(z)$coefs$norm2
f0 <- 1 / sqrt(n[2])
(f1 <- (x-a[1]) / sqrt(n[3]))
# [1] -0.3743277
(f2 <- ((x-a[2]) * sqrt(n[3]) * f1 - n[3] / sqrt(n[2]) * f0) / sqrt(n[4]))
# [1] 0.1440493
(f3 <- ((x-a[3]) * sqrt(n[4]) * f2 - n[4] / sqrt(n[3]) * f1) / sqrt(n[5]))
# [1] 0.1890351
Run Code Online (Sandbox Code Playgroud)

最简洁的方式,以你的多项式导出到你的C++代码很可能是出口attributes(z)$coefs$alphaattributes(z)$coefs$norm2再利用递推公式在C++来评估你的多项式.

  • @Gilead是的我也看到了这个参考,但说实话,我发现更容易阅读[源代码](https://code.google.com/p/renjin/source/browse/packages/stats/src/main /R/contr.poly.R?spec=svndfc698cbde95783fac720091933b36557e78e86c&r=dfc698cbde95783fac720091933b36557e78e86c)(110-124行)来弄明白. (3认同)