2013-02-22 66 views
1

的替換這是我在哪裏到目前爲止:爲方法=「黃土」

我有兩列AB(均包含實數),其中b取決於a數據幀df。我將這些列彼此對齊:

p = ggplot(df, aes(A, B)) + geom_point() 

並查看該關係是非線性關係。添加:

p = p + geom_smooth(method = 'loess', span = 1) 

給出了一條'最佳'最適合的路線。賦予了新的價值A然後我用下面的方法來預測B價值a

B.loess = loess(B ~ A, span = 1, data = df) 
predict(B.loess, newdata = a) 

到目前爲止,一切都很好。然而,我然後意識到我不能外推使用loess(大概是因爲它是非參數?!)。外推似乎相當自然 - 的關係看起來像一個電源類型的事情是怎麼回事e.g:

x = c(1:10) 
y = 2^x 
df = data.frame(A = x, B = y) 

這是我擺脫這種困境。首先,如果不使用loess,我可以使用什麼方法來繪製最適合這種(「強力」)數據的線?可憐的嘗試,如:

p = ggplot(df, aes(A, B)) + geom_point() + 
     geom_smooth(method = 'lm', formula = log(y) ~ x) 

給我錯誤。另外,假設我實際上能夠畫出一條我感到滿意的最適合的線,但我在使用時以類似的方式使用predict時遇到問題。對於例子起見,假設我很高興與最佳擬合線:

p = ggplot(df, aes(A, B)) + geom_point() + 
     geom_smooth(method = 'lm', formula = y ~ x) 

然後,如果我想預測,如果A等於11(理論上2^11)B將採取什麼樣的價值,下面的方法做不工作:

B.lm = lm(B ~ A) 
predict(B.lm, newdata = 11) 

任何幫助非常感謝。乾杯。

回答

10

首先,要回答你的最後一個問題,你需要提供一個帶有colnames的data.frame是預測變量。

B.lm <- lm(B ~ A,data=df) 
predict(B.lm, newdata = data.frame(A=11)) 

    1 
683.3333 

作爲黃土的替代品,您可以嘗試一些更高級的多項式迴歸。在這裏,我在這個圖中比較poly~3loess使用latticeExtra(更容易添加xspline插值),但與ggplot2(層)類似的語法。

xyplot(A ~ B,data=df,par.settings = ggplot2like(), 
     panel = function(x,y,...){ 
     panel.xyplot(x,y,...) 
     grid.xspline(x,y,..., default.units = "native") ## xspline interpolation 
     })+ 
    layer(panel.smoother(y ~ poly(x, 3), method = "lm"), style = 1)+ ## poly 
    layer(panel.smoother(y ~ x, span = 0.9),style=2) ### loeess 

enter image description here

+0

嗨,謝謝你的回答agstudy。而不是嘗試更高的多項式迴歸,是不可能使用功率迴歸(我認爲這些會更適合我的數據)?如果可能的話,你會好心編輯你的帖子,告訴我如何做到這些?我會很感激。乾杯。 – user32259 2013-02-27 12:44:08

5

默認surfaceloess.controlinterpolate這勿庸置疑不允許推斷。替代方案direct允許您推斷,但問題仍然存在,以確定這是否有意義。

predict(loess(hp~disp,mtcars),newdata=1000) 
[1] NA 
predict(loess(hp~disp,mtcars,control=loess.control(surface="direct")),newdata=1000) 
[1] -785.0545 
+0

歡呼詹姆斯。是的,我同意推斷可能不一定有意義。在這種情況下,它似乎有效的原因是數據中的依賴關係似乎可以使用冪函數進行建模。 – user32259 2013-02-25 10:34:41

+0

整潔。請給我們繪製OP的數據集圖,以便我們自己比較。 – smci 2014-03-28 17:30:36