2016-03-22 177 views
0

我是R的新手,一直試圖將非線性模型擬合到一些數據,但是失敗了。最後,我在Excel中添加了一個多項式趨勢線,並嘗試繪製我得到的函數 - 出於某種原因,函數不適合我在R中的數據。我嘗試了簡單的geom_smooth,但實現了「龐大」的一行,我想光滑的一個。 我在一個plot中有6個樣本,這裏是其中一個樣本的數據,包括Excel獲得的函數和我試圖繪製的樣本。我確信有更好的方法 - 我也需要在輸出中獲得擬合的功能。在R中繪製非線性迴歸

datax <- c(0, 21.3, 30, 46.3, 72) 
datay <- c(0, 0.008723333, 0.016253333, 0.039896667, 0.079893333) 
data <- data.frame(datax, datay) 
x <- seq(0, 0.01, length.out = 72) 
poly.fit <- function(x) 1E-5*x^2+0.0002*x 
ggplot(data, aes(x=datax, y=datay)) + 
    geom_point() + 
    stat_function(fun=poly.fit) 

回答

2

那麼,該功能並不完全適合數據。 運行代碼和poly.fit(46.3)它返回0.0306969這不是.03989

問題在於方程本身。如果你確實想在R中創建一個完全匹配數據的函數,那麼有一個叫做polynomial interpolation的原則,它幾乎指出如果你想完美地匹配它,你需要和模型中的條款一樣多的點。所以,如果你想匹配的點,你可以使用:

m <- lm(datay ~ poly(datax,4)) # poly() fits the polynomial with 4+1 terms 
summary(m)      # displays coefficients 

一旦你的係數,就可以重新創建功能像之前,並應調整至線,完美地滿足您的積分(只要你適合足夠的多項式項!)。

編輯: 這裏是可再現的代碼的一個例子,其顯示你想要什麼

library(ggplot2) 
datax <- c(0, 21.3, 30, 46.3, 72) 
datay <- c(0, 0.008723333, 0.016253333, 0.039896667, 0.079893333) 
data <- data.frame(datax, datay) 

# This is another approach to the fitting using I() 
m <- lm(datay ~ datax + I(datax^2) + I(datax^3) + I(datax^4)) 

x <- seq(0, 72, by = .1) 
poly.fit = function(x){  
    as.numeric(m$coefficients[1]) + 
    as.numeric(m$coefficients[2])*x + 
    as.numeric(m$coefficients[3])*x^2 + 
    as.numeric(m$coefficients[4])*x^3 + 
    as.numeric(m$coefficients[5])*x^4 
} #This way you dont have to copy and paste coefficients 

ggplot(data, aes(x=datax, y=datay)) + 
    geom_point() + 
    stat_function(fun=poly.fit) 
+0

貫徹係數的精度提供了一個更好的擬合:poly.fit < - 函數(X)1.221E-5 * x^2 + 0.0002531 * x-0.00083 – Dave2e

+0

謝謝@cgage,但我在重新創建函數時遇到了一些麻煩。我不確定這些係數是否正確,或者我正確使用它們,模型沒有問題。你可以點亮一下嗎? –

+0

沒問題,我編輯了我的答案,讓事情變得更簡單。希望這是你想要的。 – cgage