1

スプライン パッケージの bs 関数を使用して、グラフィカルな目的で b スプライン スムージング カーブを作成しています。(Excel が滑らかな折れ線グラフに 3 次 b スプラインを使用しているというレポートが少なくとも 1 つあります。これらの曲線を複製できるようにしたいと考えています。) bs 関数に必要な引数を理解するのに苦労しています。代表的なコードは以下のとおりで、bs のドキュメントから引用されています。

require(splines)
require(ggplot2)
n <- 10
x <- 1:10
y <- rnorm(n)
d <- data.frame(x=x, y=y)
summary(fm1 <- lm(y ~ bs(x, degree=3)), data=d)
x.spline <- seq(1, 10, length.out=n*10)
spline.data <- data.frame(x=x.spline, y=predict(fm1, data.frame(x=x.spline)))
ggplot(d, aes(x,y)) + geom_point + geom_line(aes(x,y), data=spline.data)

bs ドキュメントのサンプル コードでは、bs の呼び出しで df=5 が指定されており、次数は指定されていません。自由度がどれくらいあるかわかりません。私が知っているのは、3 次の b スプラインが必要だということだけです。次数の代わりに、または次数に加えて df のさまざまな値を指定して実験したところ、劇的に異なる結果が得られました。これが、ここで df の仕様が問題であると思われる理由です。このコンテキストで df をどのように計算しますか?

ヘルプ ファイルでは、df = length(knots) + degree が提案されています。内部の点をノットとして扱うと、この例では df=11 になり、エラー メッセージと無意味なスプライン フィットが生成されます。

前もって感謝します。

どうやら私の意図が明確ではなかったようです。私はこれをやろうとしています: ggplot で spline() を使用するにはどうすればよいですか? 、ただし B スプラインを使用します。

4

2 に答える 2

3

すべてのポイントに合わせようとする必要はありません。目標は、許容可能な適合であるが、限られた数のノットに依存する要約を見つけることです。多項式の次数をデフォルトの 3 より大きくしてもあまり意味がありません。10 ポイントしかない場合、df=11 は必要ありません。df=5 を試すと、結果はかなりフラットになるはずです。rms/Hnisc パッケージの作成者である Frank Harrell は、制限された 3 次スプラインを好みます。これは、極値での予測が線形であり、他の多項式ベースで発生するよりもワイルドではないためです。

いくつかのスペルミスを修正し、knotsコードが機能するように引数を追加しました。

require(splines)
require(ggplot2); set.seed(trunc(100000*pi))

n <- 10
x <- 1:10
y <- rnorm(n)
d <- data.frame(x=x, y=y)
summary(fm1 <- lm(y ~ bs(x, degree=3, knots=2)), data=d)
x.spline <- seq(1, 10, length.out=n*10)
spline.data <- data.frame(x=x.spline, y=predict(fm1, data.frame(x=x.spline)))
ggplot(d, aes(x,y)) + geom_point() + geom_line(aes(x,y), data=spline.data)

フランク・ハレルは彼が話していることを知っているという意見で、ランダムシードを変える練習から離れました。彼のパッケージを使用する場合、極限で同じような動作は得られません。

于 2012-04-27T23:01:29.200 に答える
0

もう少し作業をして、次のことを思いつきました。まず、お詫び申し上げます。私が探していたのは、回帰スプラインではなく、平滑化スプラインでした。質問を正しく表現するための語彙がありませんでした。bs()のヘルプファイルの例はこれを提供しているように見えますが、この関数は私のサンプルデータに対して同じ動作を提供していません。statsパッケージには別の関数smooth.splineがあり、必要なものを提供します。

set.seed(tunc(100000*pi))
n <- 10
x <- 1:n
xx <- seq(1, n, length.out=200)
y <- rnorm(n)
d <- data.frame(x=x, y=y)
spl <- smooth.spline(x,y, spar=0.1)
spline.data <- data.frame(y=predict(spl,xx))
ggplot(d,aes(x,y)) + geom_point() + geom_line(aes(x,y), spline.data)
spl2 <- smooth.spline(x, y, control=
            list(trace=TRUE, tol=1e-6, spar=0.1, low=-1.5, high=0.3))
spline.data2 <- data.frame(predit(spl2,xx))
ggplot(d,aes(x,y)) + geom_point() + geom_line(aes(x,y), spline.data2)

Smooth.splineへの2つの呼び出しは、2つのアプローチを表しています。1つ目は平滑化パラメーターを手動で指定し、2つ目は最適な解を繰り返します。求めていたタイプのソリューションを取得するには、最適化を適切に制約する必要があることがわかりました。

結果は、Excelの折れ線グラフで使用されるbスプラインと一致することを目的としています。私にはExcelグラフィックスを標準と見なす共同作業者がいますが、少なくともそのパフォーマンスに匹敵する必要があります。

于 2012-05-03T18:52:31.987 に答える