失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 非线性回归-转化为线性回归以及非线性模型-用R语言实现

非线性回归-转化为线性回归以及非线性模型-用R语言实现

时间:2022-10-12 16:50:55

相关推荐

非线性回归-转化为线性回归以及非线性模型-用R语言实现

可化为线性回归的曲线回归

理论

例如这样的多次方

可以

就可以使其化成线性回归。转化为线性模型,再使用lm()

实例

这是一组随时间变化的数,t为时间,y为因变量

通过散点图可以看出是非线性曲线

下面是代码块,我将x平方设成一个新变量,并且将logy设成一个新变量

df = read.csv("F:\\learning_kecheng\\huigui\\9非线性回归\\data9.1.csv")attach(df)df$ly = log(df$y)plot(t,y,data = df)plot(t,ly,data = df)lm = lm(y~t,data = df)summary(lm)lm1 = lm(ly~t,data = df)summary(lm1)anova(lm1)df$t2 = df$t^2lm2 = lm(y~t+t2,data = df)summary(lm2)lm3 = lm(ly~t+t2,data = df)summary(lm3)plot(t,y)lines(t,exp(predict(lm3)),col = 'red')abline(lm)AIC(lm1)AIC(lm2)AIC(lm3)

拟合结果

多项式回归

多项式回归同上,也是多项式作为一个新变量。同样使用lm(),注意此时平方项等使用I(x^2)

实例

以下面的数据为例

多项式通过一个一个实验,对比P值和AIC值

df9.2 = read.csv("F:\\learning_kecheng\\huigui\\9非线性回归\\data9.2.csv")attach(df9.2)lm1 = lm(y~x1)lm2 = lm(y~x1+x2)lm3 = lm(y~x1+x2+I(x1^2))lm4 = lm(y~x1+I(x2^2))lm5= lm(y~x1+x2+I(x1^2)+I(x2^2)++I(x2*x1))lm_s = step(lm5)summary(lm_s)summary(lm1)AIC(lm1)AIC(lm2)AIC(lm3)AIC(lm4)AIC(lm5)

非线性模型

有些模型不能转化为线性模型,就是非线性模型。

非线性模型,使用nls()

nls(formula,data,start,…),

formula 部分为非线性模型的函数表达式,start 为模型中未知参数的初始值。

nls()函数使用补充:

nls(formula, data, start, control, algorithm, trace, subset, weights, na.action, model, lower, upper, …)

注:start设置了参数初始值,设定trace为真以显示迭代过程。nls函数默认采用Gauss-Newton方法寻找极值,迭代过程中第一列为RSS值,后面三列是各参数估计值。

还有一种更为简便的方法就是采用内置自启动模型(self-starting Models),此时我们只需要指定函数形式,而不需要指定参数初始值,各种函数所对应的selfstarting函数名及使用语言格式详见R。下面代码有用SSgompertz 和SSweibull 进行演示。

更多信息可以在R的help中搜索 nls ,进入

在右下角selfstart链接进去就是。

实例

数据展示

df9.4 = read.csv("F:\\learning_kecheng\\huigui\\data9.4.csv")attach(df9.4)y= df9.4[,3]t= df9.4[,2]model = nls(y~k*(a^(b^t)),start = list(a=0.5,b=0,k=120))model = nls(y~k*(a^(b^t)),start = list(a=0.5,b=0.5,k=120),lower = c(0,0,116),upper = c(1,1,200),algorithm = "port")c = coef(model) #将模型的回归系数赋给ctt = c(1:30)yp = c[3]*(c[1]^(c[2]^tt))#预测了30个predict(model) #只有25个观测值t1 = t+1979t2 = tt+1979plot(t1,y,type = "o",ann = FALSE,ylim = c(0,160),xlim = c(1979,))lines(t2,yp)#使用selfstart #SSgompertz #Asym*exp(-b2*b3^x)fm1 <- nls(y ~ SSgompertz(t, Asym, b2, b3))summary(fm1)summary(model)#还可以使用SSweibull df9.5 = read.csv("F:\\learning_kecheng\\huigui\\data9.5.csv")attach(df9.5)fm2 <- nls(y ~ SSweibull(t, Asym, Drop, lrc, pwr), data = df9.5)summary(fm2 )

如果觉得《非线性回归-转化为线性回归以及非线性模型-用R语言实现》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。