2016-02-04 17 views
5

Ich versuche eine glatte Linie zu zeichnen, die direkt durch alle meine Datenpunkte verläuft und einen Gradienten hat, der auf einer anderen Variablen basiert. Theoretisch würde die Polynominterpolation die Aufgabe erledigen, aber ich bin nicht sicher, wie ich das mit ggplot machen würde. Dies ist, was ich mit so weit habe kommen:Plotten glatte Linie durch alle Datenpunkte vielleicht Polynominterpolation?

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) 

So kann ich die Steigung bekomme ich mit will geom_line aber es ist nicht glatt. Mit stat_smooth bekomme ich eine glatte Linie, aber es durchläuft nicht alle Datenpunkte und hat nicht den gewünschten Verlauf. Irgendwelche Ideen, wie man das erreicht?

enter image description here

Antwort

13

Eine Polynom-Interpolation in dem Sinne, dass Sie es verwenden, ist wahrscheinlich nicht die beste Idee, wenn Sie es durch alle Ihre Punkte gehen wollen. Sie haben 24 Punkte, die ein Polynom der Ordnung 23 benötigen würden, wenn es alle Punkte durchlaufen sollte. Ich kann nicht 23, zu verwenden poly mit Grad scheinen aber einen geringeren Grad verwendet, ist bereits genug, um Ihnen zu zeigen, warum dies nicht funktionieren:

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

Dies ist mehr oder weniger durch alle Punkte (und es wäre tatsächlich, wenn es mir gelänge, ein Polynom mit noch höherer Ordnung zu verwenden), aber ansonsten ist es wahrscheinlich nicht die Art von weicher Kurve, die Sie wollen. Eine bessere Option ist die Interpolation mit splines. Dies ist auch eine Interpolation, die Polynome verwendet, aber anstatt nur eine zu verwenden (wie Sie es versucht haben), verwendet sie viele. Sie werden gezwungen, alle Datenpunkte so zu durchlaufen, dass Ihre Kurve kontinuierlich ist.

Soweit ich weiß (und ich könnte falsch sein), kann dies nicht direkt mit ggplot erfolgen, so zeige ich Ihnen eine Lösung, wo die Spline-Interpolation in einem separaten Schritt hergestellt wird:

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

Sie benötigen as.data.frame, weil spline eine Liste zurückgibt. Jetzt können Sie diese neuen Daten in der Handlung verwenden mit geom_line():

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

Ah sehr cool Ich war Splines aus, aber ich wusste nicht, wie sie in mein Grundstück zu integrieren. – moku

+1

Ich denke, Sie können mit 'stat_smooth' ein ähnliches Ergebnis erzielen, wenn Sie' method = "gam" 'verwenden und die Anzahl der Knoten (oder die Dimension des geglätteten Terms, denke ich) ändern:' stat_smooth (aes (y = impressions, x = Stunde), Formel = y ~ s (x, k = 24), Methode = "gam", se = FALSE) ' – aosmith

Verwandte Themen