今天的主角只有一個函數,nls,專業的非線性擬合,光是看說明文件都有點眼花,不過在大致搞明白是怎麼回事之後,我覺得這應該是一個R語言用變量前不做任何聲明導致理解故障的典型
![R語言——非線性最小二乘迴歸](http://p2.ttnews.xyz/loading.gif)
由於它的說明裡正兒八經的做出了一個警告,這個擬合工具恰恰不能用於完美擬合的0殘差數據,所以舉例時選擇導個數據不太規則的文件進來
以下是數據的導入和預處理,還有散點圖:
T1 T1$Data plot(T1)
![R語言——非線性最小二乘迴歸](http://p2.ttnews.xyz/loading.gif)
先放個直線擬合的結果(以相關係數來評價),以便後頭確定非線性的擬合是否效果更好
#線性迴歸,得到相關係數0.964
FitV1 cor(T1$Data, FitV1)
然後是非線性迴歸,這時咱得考慮一下使用什麼樣的曲線形式,先嚐試個簡單點的,從一元一次提到一元二次,這樣的話,方程的計算形式為y=w0 + w1 * x + w2 * x^2,先寫個按此方程計算擬合值的function,再放入nls函數中計算係數組w0, w1, w2
#非線性迴歸(一元二次)
CalCurve y=w0 + w1 * x + w2 * x^2;
return(y)}
Trial1 #求二次模型係數,擬合值和相關係數
coef(Trial1)
FitV2 cor(T1$Data, FitV2)
發覺理解障礙的point在哪兒了不?嗯,所有係數(w開頭那3個)都是直接上手就用了,導致整個式子看起來都有點突兀
而中間一大段Warning信息是因為我偷了個懶,沒按著nls的要求輸入係數的初始值,倒是不影響出結果,得到相關係數0.9770,比直線時強了那麼一點
畫個曲線圖看看:
C1 plot(T1)
curve(CalCurve(x,C1[1],C1[2],C1[3]),1,nrow(T1), add = TRUE)
然後,有簡單版那對應就得有晉級版,目前的二次曲線如果說基本可以符合所有散點的總體趨勢,那想要再貼近一點的話,可以試試加入週期性,比如把計算公式變成這樣:
y = w0 + w1*x + w2*x^2 + w3 *cos(w4 *x+w5)
動起來做做看
#非線性迴歸(加入週期性)
CTCurve y = w0 + w1*x + w2*x^2 + w3 *cos(w4 *x+w5);
return(y)}
Trial2 #求週期模型係數,擬合值和相關係數
coef(Trial2)
FitV3 cor(T1$Data, FitV3)
相關係數0.9771,改進的幅度很小,看來,這個數列並沒有體現出很規律的週期性
再畫個曲線圖,今兒就算是圓滿結束了
C2 plot(T1)
curve(CTCurve(x,C2[1],C2[2],C2[3], C2[4], C2[5],C2[6]),
1,nrow(T1), col ="blue", add = TRUE)
閱讀更多 jennifer5jl 的文章