R:难以生成介于0和1之间的正交多项式

时间:2018-06-21 00:01:53

标签: r polynomials orthogonal

我正在尝试对间隔[0,1]的变量进行回归。我想包括正交的二次和三次分量。我追求的多项式是Shifted Legendre polynomials(维基百科)。

我对R中poly()函数的行为感到困惑。 它不仅不返回[0,1]中的向量,而且返回的向量也随输入向量的长度而变化。

此代码生成一个说明性示例。该代码从x生成一些一阶多项式(线)。所得多项式的间隔范围为[-0.36,0.36]至[-0.017,0.017]。

x <- seq(0,1,by = 0.1) # base variable
plot(x,x,col=2)

M<-matrix(nrow=6,ncol=4)
dfpoly<-data.frame(M)

v<- c(0.05,0.01,0.005,0.001,0.0005,0.0001) # This vector alters the length of x

for (i in 1:length(v)){
    x <- seq(0,1,by = v[i])
    y <- poly(x,degree = 3)[,1] #first order polynomial, should in my mind be the same as x
    points(x,y)
    dfpoly[i,1] <- length(x)
    dfpoly[i,2] <- min(y)
    dfpoly[i,3] <- max(y)
    dfpoly[i,4] <- mean(diff(y)/diff(x))
    }
names(dfpoly) <- c("x length","y min","y max","y slope")
dfpoly

graph of x vs generated first order polynomials

输出摘要:

  x length          y min         y max       y slope
1       21 -0.36037498508 0.36037498508 0.72074997016
2      101 -0.17064747029 0.17064747029 0.34129494057
3      201 -0.12156314064 0.12156314064 0.24312628128
4     1001 -0.05469022724 0.05469022724 0.10938045447
5     2001 -0.03870080906 0.03870080906 0.07740161813
6    10001 -0.01731791041 0.01731791041 0.03463582082

现在,我希望所有线条与x占据相同的间隔[0,1],并与图形上的x(点的红色系列)完美重叠。但是他们没有。他们也没有任何我可以通过肉眼识别的模式。

1。 poly()导致异常间隔行为的原因是什么?

2。我是否可以使用其他技术或函数将这些多项式强制为[0,1]?

1 个答案:

答案 0 :(得分:0)

poly()函数将返回一个矩阵,其列为以x的值评估的多项式的值。在帮助页面?poly中,各列相互正交,并且还与常数多项式p(x) = 1正交。正交性在矢量意义上(即$ \ sum x_i y_i = 0 $)。

我认为帮助页面不能保证这一点,但是实际上,这些列也是单位长度,即$ \ sum x_i ^ 2 = 1 $。

单位长度条件说明您的“怪异间隔行为”。更多的术语意味着它们必须更小才能仍然具有等于1的平方和。

要将列强制为[0,1]范围,只需减去最小值并除以范围即可。这将同时失去正交性和单位长度属性,但是 将保持度数和线性独立性。

例如

x <- seq(0,1,by = 0.1) # base variable
plot(x,x,col=2)

M<-matrix(nrow=6,ncol=4)
dfpoly<-data.frame(M)

v<- c(0.05,0.01,0.005,0.001,0.0005,0.0001) # This vector alters the length of x

for (i in 1:length(v)){
        x <- seq(0,1,by = v[i])
        y <- poly(x,degree = 3)[,1] #first order polynomial, should in my mind be the same as x
        y <- (y - min(y))/diff(range(y))
        points(x,y)
        dfpoly[i,1] <- length(x)
        dfpoly[i,2] <- min(y)
        dfpoly[i,3] <- max(y)
        dfpoly[i,4] <- mean(diff(y)/diff(x))
}
names(dfpoly) <- c("x length","y min","y max","y slope")
dfpoly

此打印

  x length y min y max y slope
1       21     0     1       1
2      101     0     1       1
3      201     0     1       1
4     1001     0     1       1
5     2001     0     1       1
6    10001     0     1       1