R 如何找到非线性模型的起始值?

R 如何找到非线性模型的起始值?,r,non-linear-regression,R,Non Linear Regression,在Windows 10上使用RStudio v1.3.1093,R v.4.0.2 我正在处理一个家庭作业问题,并给出了一个数据集: x <- cbind(c(8, 8, 14, 14, 14, 16, 16, 16, 18, 18, 20, 20, 20, 22, 22, 22, 24, 24, 24, 26, 26, 26, 28, 28, 30, 30, 30, 32, 32, 34, 36, 36, 42)) y <- cbind(c(0.49, 0.49, 0.45, 0.

在Windows 10上使用RStudio v1.3.1093,R v.4.0.2

我正在处理一个家庭作业问题,并给出了一个数据集:

x <- cbind(c(8, 8, 14, 14, 14, 16, 16, 16, 18, 18, 20, 20, 20, 22, 22, 22, 24, 24, 24, 26, 26, 26, 28, 28, 30, 30, 30, 32, 32, 34, 36, 36, 42))
y <- cbind(c(0.49, 0.49, 0.45, 0.43, 0.43, 0.44, 0.43, 0.43, 0.46, 0.45, 0.42, 0.42, 0.43, 0.41, 0.41, 0.40, 0.42, 0.40, 0.40, 0.41, 0.40, 0.41, 0.41, 0.40, 0.40, 0.40, 0.38, 0.41, 0.40, 0.40, 0.41, 0.38, 0.39))

df <- data.frame('x' = x, 'y' = y)
要获取初始值,但当我适合模型时:

fit <- nls(y ~ a - b*exp(-c*x), data = df, start = list(a = i[1], b = i[2], c = i[3]))

fit我认为您可能使用了错误的自启动功能。在这种情况下,可以绘制点,并在绘制曲线时旋转参数,从而使
nls
足够接近:

x0.38621-0.21016 0.09033
#>剩余平方和:0.003971
#> 
#>收敛的迭代次数:4
#>达到收敛公差:2.089e-08
绘图(df)
行(5:50,预测(拟合,新数据=列表(x=5:50)),col=“红色”,lty=2)

如果你想要一些自动接近起点的东西(并且不想写一个自我开始),你可以做一些假设:

  • 假设c为正(即,图中显示的衰变类似于半衰期曲线,如数据所示),则
    exp(-c*x)
    将在大x时趋于零,因此只要数据中有一个合理的范围,
    y
    的最小值可能接近
    a
  • 如果我们从估计的
    a
    中减去y数据,
    b
    的值与通过结果点的线性回归的截距不会太远
  • 通过将这些新y值的对数除以
    b
    所创建的回归线的斜率将接近-c
  • 因此,我们可以为这种类型的曲线创建一个粗略的、现成的估计器,如下所示:


    roughstart我认为您可能使用了错误的自启动功能。在这种情况下,可以绘制点,并在绘制曲线时旋转参数,从而使
    nls
    足够接近:

    x0.38621-0.21016 0.09033
    #>剩余平方和:0.003971
    #> 
    #>收敛的迭代次数:4
    #>达到收敛公差:2.089e-08
    绘图(df)
    行(5:50,预测(拟合,新数据=列表(x=5:50)),col=“红色”,lty=2)
    

    如果你想要一些自动接近起点的东西(并且不想写一个自我开始),你可以做一些假设:

  • 假设c为正(即,图中显示的衰变类似于半衰期曲线,如数据所示),则
    exp(-c*x)
    将在大x时趋于零,因此只要数据中有一个合理的范围,
    y
    的最小值可能接近
    a
  • 如果我们从估计的
    a
    中减去y数据,
    b
    的值与通过结果点的线性回归的截距不会太远
  • 通过将这些新y值的对数除以
    b
    所创建的回归线的斜率将接近-c
  • 因此,我们可以为这种类型的曲线创建一个粗略的、现成的估计器,如下所示:

    roughstart1)使用
    SSASSYMP
    运行nls,然后适当转换参数,给出以下
    st
    中的答案。如果希望完全使用参数化进行干净运行,请使用转换后的参数作为起始值再次运行nls,如下所示。第二次运行将有0次迭代,因为我们从最佳状态开始

    fit0 <- nls(y ~ SSasymp(x, Asym, R0, lrc), df)
    st <- with(as.list(coef(fit0)), c(a = Asym, b = Asym - R0, c = exp(lrc)))
    nls(y ~ a - b * exp(-c*x), data = df, start = st)
    
    2)如图所示,使用问题中的数据运行nls没有问题,但如果您对不同的数据有问题,并且需要第二个选项,请尝试drc包中的AR.3模型。下面的代码遵循上面的代码,除非我们进行更改以适应不同的参数化

    library(drc)
    fit1 <- drm(y ~ x, data = df, fct = AR.3())
    co <- setNames(coef(fit1), c("c", "d", "e"))
    st <- with(as.list(co), c(a = d, b = d - c, c = 1/e))
    nls(y ~ a - b * exp(-c*x), data = df, start = st)
    
    库(drc)
    fit11)使用
    SSASSYMP
    运行nls,然后适当转换参数,给出如下
    st
    所示的答案。如果希望完全使用参数化进行干净运行,请使用转换后的参数作为起始值再次运行nls,如下所示。第二次运行将有0次迭代,因为我们从最佳状态开始

    fit0 <- nls(y ~ SSasymp(x, Asym, R0, lrc), df)
    st <- with(as.list(coef(fit0)), c(a = Asym, b = Asym - R0, c = exp(lrc)))
    nls(y ~ a - b * exp(-c*x), data = df, start = st)
    
    2)如图所示,使用问题中的数据运行nls没有问题,但如果您对不同的数据有问题,并且需要第二个选项,请尝试drc包中的AR.3模型。下面的代码遵循上面的代码,除非我们进行更改以适应不同的参数化

    library(drc)
    fit1 <- drm(y ~ x, data = df, fct = AR.3())
    co <- setNames(coef(fit1), c("c", "d", "e"))
    st <- with(as.list(co), c(a = d, b = d - c, c = 1/e))
    nls(y ~ a - b * exp(-c*x), data = df, start = st)
    
    库(drc)
    
    根据你的数据,我在R4.0.3和Mac Big Sur 10.16上运行良好,即
    getInitial(y~SSasymp(x,a,b,c),data=df)#ab c 0.3854869 0.5906224-2.4551192
    这些也是我得到的值。但是当我使用这些值来拟合模型时,也就是我得到错误的时候。你能展示给出错误的代码以便测试吗?我用模型更新了帖子。有了你的数据,我在R4.0.3和Mac Big Sur 10.16上运行得很好,即
    getInitial(y~SSasymp(x,a,b,c),data=df)#a b c 0.3854869 0.5906224-2.4551192
    这些也是我得到的值。但是,当我使用这些值来拟合模型时,也就是我得到错误的时候。你能展示给出错误的代码以便测试它吗。