R 中使用lm進行非線性擬合


以前只是知道R 中的lm函數能夠做線性擬合,恰如函數的名字:lm= linear model

不過今天需要做非線性擬合的時候, 上網搜各種函數,包括nls、nlm等等,不過nlm的用法好像和一般的建模函數不太相同;nls函數的用法倒很像,可是卻總是出error,不知道為什么。再次苦找,忽然發現其實lm函數便可以完成這個工作:

lm函數進行非線性擬合的本質是在其中加入非線性的變量,對這些非線性的變量進行線性擬合,結果還是非線性的。

library(car)
plot(USPop)
lmfit = lm(population ~ year, data = USPop) #線性擬合
lines(USPop$year, predict(lmfit))
nlmfit1 = lm(population ~ I(year^2)+year , data = USPop) #這里把一個平方項year^2用I來標記成一個變量
nlmfit1
summary(nlmfit1)
lines(USPop$year, predict(nlmfit1), col = 'red')  #非線性擬合

再上一個例子,是自己研究中的:

Type_Num = as.numeric(Type_Fac)
nlm = lm(Gene_Data ~ I(exp(-Type_Num))) #這里把一個指數函數用I包裝成為線性擬合函數lm的一個變量
#nlm
summ_nlm = summary(nlm)
summ_nlm
nlm_pval = summ_nlm$coefficients[2,4]
#lm
fit_all = lm(Gene_Data ~ as.numeric(as.factor(Type)))
summ_all = summary(fit_all)
lmpval_all = summ_all$coefficients[2,4]
#make plot
plot(Gene_Data ~ (Type_Fac), xlab = 'Stage', ylab = 'Expression of Gene', 
     main = paste('Gene Expression vs Stage\n', 'non linear model pval for stages = ', nlm_pval,
                  '\n linear model pval for stages = ', lmpval_all))

points(Gene_Data ~ Type_Fac)
#add fitted lines
x = seq(.5,5.5,.001)
y =  17.2373 *exp(- x) +7.8884
head(y)
lines(x, y)  #non linear line
y2 = 15.7728 - 2.1422 * x
lines(x, y2) #linear line

我們可以看到: 非線性擬合的程度更好!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM