散布図があります。非線形トレンドラインを追加するにはどうすればよいですか?
散布図があります。非線形トレンドラインを追加するにはどうすればよいですか?
回答:
いくつかのデータを作成しましょう。
n <-100 x <-seq(n) y <-rnorm(n、50 + 30 * x ^(-0.2)、1) データ<-data.frame(x、y)
以下は、黄土線または非線形回帰の近似をどのように当てはめることができるかを示しています。
plot(y〜x、データ) #黄土線に合わせる loess_fit <-loess(y〜x、データ) lines(Data $ x、predict(loess_fit)、col = "blue") #非線形回帰に適合 nls_fit <-nls(y〜a + b * x ^(-c)、Data、start = list(a = 80、b = 20、 c = 0.2)) lines(Data $ x、predict(nls_fit)、col = "red")
あなたが使用している場合ggplot2
(第3の描画システムは、Rで、ベースRと格子の後に)、これは次のようになります。
library(ggplot2)
ggplot(Data, aes(x,y)) + geom_point() + geom_smooth()
データを平滑化する方法を選択できます?stat_smooth
。詳細と例を参照してください。
stat_smooth
入力?stat_smooth
してRヘルプファイルにアクセスすることで、自分でこれを見つけることができます。:-)
探しているものを正確に知ることなく、lattice
パッケージを使用して、簡単に黄土曲線を追加できますtype="smooth"
; 例えば、
> library(lattice)
> x <- rnorm(100)
> y <- rnorm(100)
> xyplot(y ~ x, type=c("smooth", "p"))
help("panel.loess")
使用する多項式の次数などを変更するために、黄土適合ルーチンに渡すことができる引数を参照してください。
更新
黄土曲線の色を変更するには、小さな関数を記述し、それをpanel
パラメーターとして渡しますxyplot
。
x <- rnorm(100)
y <- rnorm(100)
panel_fn <- function(x, y, ...)
{
panel.xyplot(x, y, ...)
panel.xyplot(x, y, type="smooth", col="red", ...)
}
xyplot(y ~ x, panel=panel_fn)
あなたの質問は少しあいまいなので、私はあなたの問題が何であるかについていくつかの仮定をするつもりです。散布図を作成してデータを少し説明できれば、非常に役立ちます。間違った仮定をしている場合は、私の答えを無視してください。
まず、データが、非線形であると合理的に信じるプロセスを記述する可能性があります。たとえば、車が急ブレーキで停止する距離と車の速度を回帰しようとしている場合、物理学は、車両のエネルギーは速度ではなく速度の二乗に比例することを教えてくれます自体。したがって、この場合は多項式回帰を試してみてください(Rでは)のようなことができますmodel <- lm(d ~ poly(v,2),data=dataset)
。さまざまな非線形性を回帰モデルに組み込む方法に関するドキュメントがたくさんあります。
一方、「グラグラ」のラインがあり、グラグラの理由がわからない場合、開始点として適切なのはおそらく局所加重回帰またはloess
R でしょう。これは小さな線形回帰データセット全体ではなく、リージョン。「k最近傍」バージョンを想像するのが最も簡単です。ここでは、任意のポイントで曲線の値を計算し、関心のあるポイントに最も近いkポイントを見つけて、それらを平均します。レスはそのようなものですが、直線的な平均の代わりに回帰を使用します。これにはmodel <- loess(y ~ x, data=dataset, span=...)
、span
変数が平滑化の度合いを制御するを使用します。
3番目の手で(手に負えない)-あなたはトレンドについて話していますか?これは一時的な問題ですか?もしそうなら、トレンドラインと統計的有意性を過剰に解釈することに少し注意してください。時系列の傾向は「自己回帰」プロセスに現れる可能性があり、これらのプロセスではプロセスのランダム性がランダムノイズからトレンドを構築することがあり、統計的有意性検定が間違っていると有意でないことがわかります。
散布図のサンプルポイントと滑らかな曲線を同じグラフに配置する:
library(graphics)
## Create some x,y sample points falling on hyperbola, but with error:
xSample = seq(0.1, 1.0, 0.1)
ySample = 1.0 / xSample
numPts <- length(xSample)
ySample <- ySample + 0.5 * rnorm(numPts) ## Add some noise
## Create x,y points for smooth hyperbola:
xCurve <- seq(0.1, 1.0, 0.001)
yCurve <- 1.0 / xCurve
plot(xSample, ySample, ylim = c(0.0, 12.0)) ## Plot the sample points
lines(xCurve, yCurve, col = 'green', lty = 1) ## Plot the curve