R: трудности генерации ортогональных многочленов между 0 и 1

Я пытаюсь сделать регрессию на переменные с интервалом [0,1]. Я хотел бы включить ортогональные квадратичные и кубические компоненты. Многочлены, за которыми я следую, - это смещенные полиномы Лежандра(Википедия).

Я озадачен поведением функции poly() в R. Мало того, что она не возвращает вектор из [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

график x против порожденных полиномов первого порядка

Резюме результатов:

  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

Теперь я ожидаю, что все линии будут занимать один и тот же интервал [0,1], что и x, и будут полностью перекрываться с x (красная серия точек) на графике. Но они этого не делают. У них также нет какой-либо модели, которую я могу определить на глаз.

1. В чем причина странного интервального поведения с poly()?

2. Существуют ли другие методы или функции, которые я могу использовать для приведения этих полиномов к [0,1]?

1 ответ

Решение

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
Другие вопросы по тегам