14

回帰には B スプラインをよく使用します。これまで、 の出力をbs詳細に理解する必要はありませんでした。関心のあるモデルを選択し、それを に適合させるだけでしたlm。ただし、外部 (非 R) コードで b スプライン モデルを再現する必要があります。では、によって生成された行列の意味は何bsですか? 例:

x <- c(0.0, 11.0, 17.9, 49.3, 77.4)
bs(x, df = 3, degree = 1) # generate degree 1 (linear) B-splines with 2 internal knots
#              1         2         3
# [1,] 0.0000000 0.0000000 0.0000000    
# [2,] 0.8270677 0.0000000 0.0000000    
# [3,] 0.8198433 0.1801567 0.0000000    
# [4,] 0.0000000 0.7286085 0.2713915    
# [5,] 0.0000000 0.0000000 1.0000000   
# attr(,"degree")
# [1] 1
# attr(,"knots")
# 33.33333% 66.66667% 
#  13.30000  38.83333 
# attr(,"Boundary.knots")
# [1]  0.0 77.4
# attr(,"intercept")
# [1] FALSE
# attr(,"class")
# [1] "bs"     "basis"  "matrix"

degree入力で指定したとおり、 1 です。knotsは、2 つの内部ノットがそれぞれ x = 13.3000 と x = 38.8333 にあることを示しています。ノットが固定された分位点にあることを見て少し驚きました。R が私のデータに最適な分位点を見つけてくれることを願っていましたが、もちろんそれではモデルが線形ではなくなり、応答データを知らなければ不可能になります。intercept = FALSE切片が基底に含まれていなかったことを意味します (それは良いことですか?私は常に、切片なしで線形モデルに適合しないように教えられてきました...まあ、lmとにかく1つ追加するだけだと思います)。

しかし、マトリックスはどうですか?解釈の仕方がよくわかりません。列が 3 つあるということは、基底関数が 3 つあるということだと思います。これは理にかなっています: 2 つの内部ノットK1K2がある場合、左境界ノットB1との間にスプラインがあり、 と のK1間に別のスプラインがK1あり、 と の間にK2最後のスプラインがあるので、... 3 つの基底関数、わかりました。しかし、正確にはどれが基底関数ですか? たとえば、この列はどういう意味ですか?K2B2

#              1
# [1,] 0.0000000
# [2,] 0.8270677
# [3,] 0.8198433
# [4,] 0.0000000
# [5,] 0.0000000

編集: これはこの質問と似ていますが、正確には同じではありません。その質問は回帰係数の解釈について尋ねますが、私はその前のステップです。モデル マトリックス係数の意味を理解したいと思います。最初の回答で提案されているのと同じプロットを作成しようとすると、めちゃくちゃなプロットが得られます。

b <- bs(x, df = 3, degree = 1)
b1 <- b[, 1]  ## basis 1
b2 <- b[, 2]  ## basis 2
b3 <- b[,3]
par(mfrow = c(1, 3))
plot(x, b1, type = "l", main = "basis 1: b1")
plot(x, b2, type = "l", main = "basis 2: b2")
plot(x, b3, type = "l", main = "basis 3: b3")

ここに画像の説明を入力

これらはノットが多すぎるため、B スプライン基底関数にすることはできません (各関数は 1 つだけにする必要があります)。

2番目の答えは、実際にはRの外でモデルを再構築できるようにするので、それでいいと思います。ただし、その答えも、b行列の要素が何であるかを正確に説明していません。ここではまだ紹介していない線形回帰の係数を扱っています。それが私の最終的な目標であることは事実ですが、この中間ステップも理解したかったのです。

4

2 に答える 2

12

マトリックスb

#              1         2         3
# [1,] 0.0000000 0.0000000 0.0000000    
# [2,] 0.8270677 0.0000000 0.0000000    
# [3,] 0.8198433 0.1801567 0.0000000    
# [4,] 0.0000000 0.7286085 0.2713915    
# [5,] 0.0000000 0.0000000 1.0000000  

は、実際には の各点における 3 つの基底関数の値の行列にすぎxません。これは、多項式線形モデルとまったく同じ解釈であるため、私には明らかなはずです。実際のところ、境界ノットは

bknots <- attr(b,"Boundary.knots")
# [1]  0.0 77.4

内部ノットは

iknots <- attr(b,"knots")
# 33.33333% 66.66667% 
#  13.30000  38.83333 

ここに示すように、3 つの基底関数は次のとおりです。

knots <- c(bknots[1],iknots,bknots[2])
y1 <- c(0,1,0,0)
y2 <- c(0,0,1,0)
y3 <- c(0,0,0,1)
par(mfrow = c(1, 3))
plot(knots, y1, type = "l", main = "basis 1: b1")
plot(knots, y2, type = "l", main = "basis 2: b2")
plot(knots, b3, type = "l", main = "basis 3: b3")

ここに画像の説明を入力

では、考えてみましょうb[,1]

#              1
# [1,] 0.0000000
# [2,] 0.8270677
# [3,] 0.8198433
# [4,] 0.0000000
# [5,] 0.0000000

これらはb1inの値でなければなりませんx <- c(0.0, 11.0, 17.9, 49.3, 77.4)。実際のところ、b1は で 0 でknots[1] = 0あり、 で 1 ですknots[2] = 13.3000。つまり、x[2](11.0)11/13.3 = 0.8270677では、期待どおり、値は でなければなりません。同様に、b1は に対して 0 であるため、 (17.9)knots[3] = 38.83333の値は でなければなりません。ので、は 0 です。他の 2 つの列についても同様の解釈ができます。x[3](38.83333-13.3)/17.9 = 0.8198433x[4], x[5] > knots[3] = 38.83333b1

于 2016-09-12T12:55:39.360 に答える