0

クランプされた b スプラインを R の一連の制御点に適合させるつもりですがknots、bs でのパラメーターの使用法を理解するのに苦労しています。一連の制御点が与えられた場合:

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ノットが存在する必要があります (m=n+p+1 あたり、#knots=m+1 の場合、#control=n+1、 degree=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 

一連の制御点と次数を指定して、ノット ベクトルを指定する正しい方法は何ですか?

4

1 に答える 1