2016-02-04 1 views
5

私はすべてのデータポイントを直接実行し、別の変数に基づいたグラデーションを持つ滑らかな線をプロットしようとしています。理論的に多項式の補間は、仕事を完了させるだろうが、私はggplotを使ってそれをどうやって行うのか分からない。これは私がこれまでに作ってみたものです:すべてのデータ点を通る滑らかな線をプロットすることは、多項式補間である可能性がありますか?

DATA:

dayofweek hour impressions conversions  cvr 
     1 0  3997982  352.0 8.80e-05 
     1 1  3182678  321.2 1.01e-04 
     1 2  2921004  248.6 8.51e-05 
     1 3  1708627  115.6 6.77e-05 
     1 4  1225059  98.4 8.03e-05 
     1 5  1211708  62.0 5.12e-05 
     1 6  1653280  150.0 9.07e-05 
     1 7  2511577  309.4 1.23e-04 
     1 8  3801969  397.8 1.05e-04 
     1 9  5144399  573.0 1.11e-04 
     1 10  5770269  675.6 1.17e-04 
     1 11  6936943  869.8 1.25e-04 
     1 12  7953053  996.4 1.25e-04 
     1 13  8711737  1117.8 1.28e-04 
     1 14  9114872  1217.4 1.34e-04 
     1 15  9257161  1155.2 1.25e-04 
     1 16  8437068  1082.0 1.28e-04 
     1 17  8688057  1047.2 1.21e-04 
     1 18  9200450  1114.0 1.21e-04 
     1 19  8494295  1086.8 1.28e-04 
     1 20  9409142  1092.6 1.16e-04 
     1 21 10500000  1266.8 1.21e-04 
     1 22  9783073  1196.4 1.22e-04 
     1 23  8225267  812.0 9.87e-05 

RのCODE:

ggplot(d) + 
    geom_line(aes(y=impressions, x=hour, color=cvr)) + 
    stat_smooth(aes(y=impressions, x=hour), method = lm, formula = y ~ poly(x, 10), se = FALSE) 

だから私は、私はgeom_lineが、その滑らかではないを使用したいグラデーションを得ることができます。 stat_smoothを使用すると滑らかな線が得られますが、すべてのデータ点を通過するわけではなく、必要なグラデーションがありません。どのようにこれを達成するための任意のアイデア?

enter image description here

答えて

13

あなたはそれがあなたのすべての点を通過する場合、あなたがそれを使用している意味での多項式補間は、おそらく最高のアイデアではありません。すべてのポイントを通過する必要がある場合は、23ポイントの多項式が必要な24ポイントがあります。私は度23でpolyを使用するように見えるが、これは動作しませんなぜ低い程度を使用すると、すでにお見せするために十分であることはできません。

ggplot(d) + 
    geom_point(aes(x = hour, y = impressions, colour = cvr), size = 3) + 
    stat_smooth(aes(x = hour, y = impressions), method = "lm", 
       formula = y ~ poly(x, 21), se = FALSE) + 
    coord_cartesian(ylim = c(0, 1.5e7)) 

enter image description here

これは、多かれ少なかれを通過んすべての点(実際にはもっと高次の多項式を使うことができればそうだが)そうでなければ、あなたが望む滑らかな曲線の種類ではないだろう。 より良いオプションは、splinesで補間を使用することです。これは多項式を使用する補間でもありますが、試したように1つだけを使用するのではなく、多項式を使用します。彼らはあなたのカーブが連続するような方法ですべてのデータポイントを通過するように強制されます。限り私が知っている(と私は間違っているかもしれない)として

、これはggplotで直接実行することはできませんので、私はあなたにスプライン補間を別々の工程で製造された解決策表示:

spline_int <- as.data.frame(spline(d$hour, d$impressions)) 

splineがリストを返すので、as.data.frameが必要です。

ggplot(d) + 
    geom_point(aes(x = hour, y = impressions, colour = cvr), size = 3) + 
    geom_line(data = spline_int, aes(x = x, y = y)) 

enter image description here

+0

ああ、私はスプラインを見ていたが、私は私のプロットにそれらを統合する方法を知りませんでした非常にクール:今、あなたはgeom_line()とのプロットでその新しいデータを使用することができます。 – moku

+1

'stat_smooth'では、' method = "gam" 'を使ってノットの数を変更することで、同様の結果を得ることができると思います(stat_smooth(aes(y = impressions、x =時間)、数式= y〜s(x、k = 24)、方法=「gam」、se = FALSE) – aosmith

関連する問題