web-dev-qa-db-ja.com

RのLOESSを使用して線を合わせる

データセットにいくつかのポイントがあり、その上に線を合わせたいと思います。 loess関数で試しました。残念ながら、非常に奇妙な結果が得られます。以下のプロットを参照してください。ポイントを通過し、プロット全体に広がる線が期待されます。どうすればそれを達成できますか? plot

再現方法:

https://www.dropbox.com/s/ud32tbptyvjsnp4/data.R?dl=1 (2 kbのみ)からデータセットをダウンロードし、次のコードを使用します。

load(url('https://www.dropbox.com/s/ud32tbptyvjsnp4/data.R?dl=1'))
lw1 = loess(y ~ x,data=data)
plot(y ~ x, data=data,pch=19,cex=0.1)
lines(data$y,lw1$fitted,col="blue",lwd=3)

どんな助けも大歓迎です。ありがとう!

21
leo

yではなくxに対して近似値をプロットしました。また、ラインをプロットする前にx値を順序付ける必要があります。これを試して:

lw1 <- loess(y ~ x,data=data)
plot(y ~ x, data=data,pch=19,cex=0.1)
j <- order(data$x)
lines(data$x[j],lw1$fitted[j],col="red",lwd=3)

enter image description here

53
Rob Hyndman

遅れることもありますが、ggplot(およびdplyr)にはオプションがあります。まず、ポイント上に黄土線のみをプロットする場合は、次を試すことができます。

_library(ggplot2)
load(url("https://www.dropbox.com/s/ud32tbptyvjsnp4/data.R?dl=1"))
ggplot(data, aes(x, y)) + 
geom_point() +
geom_smooth(method = "loess", se = FALSE)
_

Loess line with <code>ggplot::geom_smooth()</code>

その他の方法は、predict()関数による黄土適合を使用することです。たとえば、dplyr関数を使用して、_"loess"_という新しい列に予測を追加しました。

_  library(dplyr)
  data %>%
  mutate(loess = predict(loess(y ~ x, data = data))) %>%
  ggplot(aes(x, y)) +
  geom_point(color = "grey50") +
  geom_line(aes(y = loess))
_

Loess line with <code>predict()</code> and <code>geom_line()</code>

更新:提供されたサンプルデータをロードするコード行を追加pdate2:@phiコメントを調整するgeom_smoot()関数名の修正

1
gavg712

残念ながら、データはもう利用できませんが、ノンパラメトリックライン(ローカルウェイト散布図スムージングまたは必要に応じてLOESSのみ)をフィットする簡単な方法は、次のコードを使用することです:

scatter.smooth(y ~ x, span = 2/3, degree = 2)

パラメータspanおよびdegreeを使用して、任意の滑らかさを得ることができることに注意してください。

1
HonzaB