Укажите вектор фиксированного узла в bs-call

Я намереваюсь установить закрепленный b-сплайн на набор контрольных точек в R, но у меня проблемы с пониманием использования knots параметр в бс. Дан набор контрольных точек:

path <- data.frame(
    x = c(3, 3.5, 4.6875, 9.625, 5.5625, 19.62109375, 33.6796875, 40.546875, 36.59375, 34.5, 33.5, 33),
    y = c(0, 1, 4, 5, 6, 8, 7, 6, 5, 2, 1, 0)
)

Я подгоняю x и y независимо от расстояния вдоль пути:

path$distance <- c(0, cumsum(sqrt(diff(path[,1])^2 + diff(path[,2])^2)))
path$distance
##  [1]  0.000000  1.118034  4.344511  9.382259 13.566026 27.766169 41.860284 48.799899 52.877545 56.535931 57.950145
## [12] 59.068179

но я хочу предоставить открытый равномерный вектор узла для привязки подгонки к первой и последней точке - используя df не поддерживает это.

Насколько я понимаю, для моего заданного набора точек и степени 3 для сплайна должно быть (12-1)+3+2 = 16 knots (на m=n+p+1, для #knots=m+1, #control=n+1, deg =p), поэтому для сплайна с фиксированными значениями это должен быть хороший вектор узла:

knots <- seq(path$distance[1], path$distance[12], length.out = 10)
knots <- c(rep(knots[1], 3), knots, rep(knots[10], 3))
knots
##  [1]  0.000000  0.000000  0.000000  0.000000  6.563131 13.126262 19.689393 26.252524 32.815655
## [10] 39.378786 45.941917 52.505048 59.068179 59.068179 59.068179 59.068179

использование этого дает некоторые сумасшедшие цифры, а также предупреждение о недостатке ранга, поэтому ясно, что я должен как-то ошибиться:

pred_df  <-  data.frame(x=0,y=0,distance=seq(min(path$distance), max(path$distance), length.out=100))
xPath <- predict(lm(x~bs(distance, knots=knots, degree = 3), path), pred_df)
## Warning message:
## In predict.lm(lm(x ~ bs(distance, knots = knots, degree = degree),  :
##   prediction from a rank-deficient fit may be misleading
summary(xPath)
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
## -2133.000     3.468    16.700  -161.900    64.590   857.800 

Как правильно определить вектор узлов, заданный набором контрольных точек и степенью?

1 ответ

Судя по вашим данным "параметров" и "узлов", они действительно нарушают условие Шенберга-Уитни. Я не знаком с синтаксисом в R, но кажется, что вы генерируете значения узлов равномерно между path$distance[1] и path$distance[12]. Это неправильно. Вы должны сгенерировать свои значения узлов следующим образом:

0) Обозначим параметры как p[i], где i = 0 - (n-1), p[0]=0.0 и n - количество точек. Для вашего случая n = 12
1) Создайте значения узла как

узел [0] = (p[1]+p[2]+p[3])/3
узел [1] = (p[2]+p[3]+p[4])/3
узел [2] = (p [3] + p [4] + p [5]) / 3
......
Это внутренние значения узлов. Вы должны заметить, что p [0] и p[n-1] не будут использоваться на этом шаге. Вы должны получить 8 значений внутреннего узла для вашего случая.
2) Теперь добавьте p [0] к передней части значений узла 4 раза (для степени =3) и добавьте p[n-1] к концу значений узла 4 раза, и все готово. Для вашего случая вы должны получить 16 значений узлов.

Обратите внимание, что это не единственный способ создать действительный вектор узла. Но сгенерированный таким образом вектор узлов всегда будет удовлетворять условию Шенберга-Уитни.

Другие вопросы по тегам