rstart 图灵社区 : 阅读 : 【译文】R语言非线性回归初步

编辑:
发布时间: 2020-12-11 20:37:36
分享:
R语言非线性回归入门作者 Lionel Hertzog        在一簇散点中拟合一条回归线是数据分析的基本方法之一。有时,线性模型能很好地拟合数据,但在某些情形下,变量间的关系未必是线性的。这时,一般有三类方法解决这个问题: 通过变换数据使得其关系线性化, 用多项式或者比较复杂的样条来拟合数据, 用非线性函数来拟合数据从标题你应该已经猜到非线性回归是本文的重点什么是非线性回归在非线性回归中,分析师通常采用一个确定的函数形式和相应的参数来拟合数据。最常用的参数估计方法是利用非线性最小二乘法。该方法使用线性函数来逼近非线性函数,并且通过不断迭代这个过程来得到参数的最优解。非线性回归的良好性质之一是估计出的参数都有清晰的解释,而变换数据后得到的线性模型其参数往往难以解释。非线性最小二乘拟合首先,我们以Michaelis-Menten方程为例。

# 生成一些仿真数据set.seed x <- seqy <- *x)/+x)) + rnorm# 对于一些简单的模型,nls函数可以自动找到合适的参数初值m <- nls)# 计算模型的拟合优度cor)[1] 0.9496598# 将结果可视化plot lines, lty = 2, col = "red", lwd = 3)输出的图片如下:

等式中的代表时间t时的个体数,是个体增长速率,是环境承载能力。我们可以将这个等式改写为微分方程的形式:

library# 利用逻辑斯蒂模型生成人口增长的仿真数据,并用nls估计参数log_growth <- function { with), { dN <- R*N* return)) })}# 逻辑斯蒂增长的参数pars <- c# 设定初值N_ini <- c# 常微分方程的时间阶段times <- seq# 常微分方程out <- ode# 添加一些随机波动N_obs <- out[, 2]+rnorm# 个体数值不能小于1N_obs <- ifelse# 画图plot这部分代码只是生成了带有随机误差的仿真数据,接下来的部分会展现估计参数初值的技巧。R语言中有一个估计逻辑斯蒂方程参数的内建函数,但它使用的是如下方程:

# 寻找方程的参数SS <- getInitial, data = data.frame)我们可使用getInitial函数来对模型参数做一个基于数据的初步估计。然后把该函数的输出作为一个向量化参数传递给自启动函数,同时也将无引号的三个参数名赋值给逻辑斯蒂方程。然而,由于SSlogis的参数设定有些不同,我们需要对SSlogis的输出值做一些处理,使得其与逻辑斯蒂方程中的形式一致。

# 改变参数形式K_start <- SS["alpha"]R_start <- 1/SS["scale"]N0_start <- SS["alpha"]/+1)# 构建模型的公式log_formula <- formula/ - 1)))# 拟合模型m <- nls)# 估计参数summaryFormula: N_obs ~ K * N0 * exp/ - 1))Parameters: Estimate Std. Error t value Pr K 1.012e+03 3.446e+01 29.366 <2e-16 ***R 2.010e-01 1.504e-02 13.360 <2e-16 ***N0 9.600e-01 4.582e-01 2.095 0.0415 * ---Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1Residual standard error: 49.01 on 48 degrees of freedomNumber of iterations to convergence: 1 Achieved convergence tolerance: 1.537e-06# 计算拟合优度cor)[1] 0.9910316# 结果可视化lines, col = "red", lty = 2, lwd = 3)输出图形如下:

修改SSlogis输出的参数结构确实有些繁琐,不过值得一试。在后续的文章中,除了非线性最小二乘法,我们将利用更为可靠和强大的极大似然估计法来拟合模型。它能使你构建你能想到的任何模型。原文刊载于datascience+网站链接:http://http://datascienceplus.com/first-steps-with-non-linear-regression-in-r/
相关阅读
热门精选
孩子 皮肤