r语言多元线性回归模型:R语言非线性最小二乘回归
r语言多元线性回归模型:R语言非线性最小二乘回归C1 <- coef(Trial1) plot(T1) curve(CalCurve(x C1[1] C1[2] C1[3]) 1 nrow(T1) add = TRUE) 然后,有简单版那对应就得有晋级版,目前的二次曲线如果说基本可以符合所有散点的总体趋势,那想要再贴近一点的话,可以试试加入周期性,比如把计算公式变成这样:画个曲线图看看:#线性回归,得到相关系数0.964 FitV1 <- lm(Data~T T1)$fitted.value cor(T1$Data FitV1) 然后是非线性回归,这时咱得考虑一下使用什么样的曲线形式,先尝试个简单点的,从一元一次提到一元二次,这样的话,方程的计算形式为y=w0 w1 * x w2 * x^2,先写个按此方程计算拟合值的function,再放入nls函数中计算系数组w0 w1 w2#非线性回归(一元二次) C
今天的主角只有一个函数,nls,专业的非线性拟合,光是看说明文件都有点眼花,不过在大致搞明白是怎么回事之后,我觉得这应该是一个R语言用变量前不做任何声明导致理解故障的典型
由于它的说明里正儿八经的做出了一个警告,这个拟合工具恰恰不能用于完美拟合的0残差数据,所以举例时选择导个数据不太规则的文件进来
以下是数据的导入和预处理,还有散点图:
T1 <- read.csv("Data.csv" stringsAsFactors = FALSE) T1$Data <- as.numeric(gsub("%" "" T1$Data)) plot(T1)
先放个直线拟合的结果(以相关系数来评价),以便后头确定非线性的拟合是否效果更好
#线性回归,得到相关系数0.964 FitV1 <- lm(Data~T T1)$fitted.value cor(T1$Data FitV1)
然后是非线性回归,这时咱得考虑一下使用什么样的曲线形式,先尝试个简单点的,从一元一次提到一元二次,这样的话,方程的计算形式为y=w0 w1 * x w2 * x^2,先写个按此方程计算拟合值的function,再放入nls函数中计算系数组w0 w1 w2
#非线性回归(一元二次) CalCurve <- function(x w0 w1 w2) { y=w0 w1 * x w2 * x^2; return(y)} Trial1 <- nls(Data~CalCurve(T w0 w1 w2) T1) #求二次模型系数,拟合值和相关系数 coef(Trial1) FitV2 <- fitted(Trial1) cor(T1$Data FitV2)
发觉理解障碍的point在哪儿了不?嗯,所有系数(w开头那3个)都是直接上手就用了,导致整个式子看起来都有点突兀
而中间一大段Warning信息是因为我偷了个懒,没按着nls的要求输入系数的初始值,倒是不影响出结果,得到相关系数0.9770,比直线时强了那么一点
画个曲线图看看:
C1 <- coef(Trial1) 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 <- function(x w0 w1 w2 w3 w4 w5) { y = w0 w1*x w2*x^2 w3 *cos(w4 *x w5); return(y)} Trial2 <- nls(Data~CTCurve(T w0 w1 w2 w3 w4 w5) T1) #求周期模型系数,拟合值和相关系数 coef(Trial2) FitV3 <- fitted(Trial2) cor(T1$Data FitV3)
相关系数0.9771,改进的幅度很小,看来,这个数列并没有体现出很规律的周期性
再画个曲线图,今儿就算是圆满结束了
C2 <- coef(Trial2) plot(T1) curve(CTCurve(x C2[1] C2[2] C2[3] C2[4] C2[5] C2[6]) 1 nrow(T1) col ="blue" add = TRUE)