非线性回归-转化为线性回归以及非线性模型-用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^2
lm2 = 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)    #将模型的回归系数赋给c
tt = c(1:30)
yp = c[3]*(c[1]^(c[2]^tt))#预测了30个
predict(model)            #只有25个观测值
t1 = t+1979
t2 = tt+1979
plot(t1,y,type = "o",ann = FALSE,ylim = c(0,160),xlim = c(1979,2015))
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 )
发布了16 篇原创文章 · 获赞 9 · 访问量 1042

猜你喜欢

转载自blog.csdn.net/qq_42871249/article/details/102820427