2017-06-12 54 views
2

我是R的新手,遇到了一些我不明白的问题。我查找过关于R如何工作的文档或答案,但我找不到任何东西。nls每次迭代多次运行函数?

Test = data.frame(x = c(5, 10, 15, 25), y = c(5, 8, 12, 16)) 

fun = function(x, a, b) { 
    cat("a =", a, ", b =", b, "\n") 
    a*(x**b) 
} 

nls(y ~ fun(x, a, b), data = Test, start = list(a = 1.613, b = 0.718), trace = TRUE) 

输出如下:

a = 1.613 , b = 0.718 
a = 1.613 , b = 0.718 
a = 1.613 , b = 0.718 
a = 1.613 , b = 0.718 
0.7964401 : 1.613 0.718 
a = 1.612723 , b = 0.7177708 
a = 1.612723 , b = 0.7177708 
a = 1.612723 , b = 0.7177708 
0.7960992 : 1.6127232 0.7177708 
a = 1.612698 , b = 0.7177761 
a = 1.612698 , b = 0.7177761 
a = 1.612698 , b = 0.7177762 
0.7960992 : 1.6126980 0.7177761 
Nonlinear regression model 
    model: y ~ fun(x, a, b) 
    data: Test 
    a  b 
1.6127 0.7178 
residual sum-of-squares: 0.7961 

Number of iterations to convergence: 2 
Achieved convergence tolerance: 1.43e-06 

它说,它采取了两次迭代收敛,但它看起来像它通过函数跑了10次,只有改变的参数值的两倍。是否有一个原因?我无法找到关于nls如何计算参数猜测的解释。

我试图把600个数据点放到一个大的函数中,所以这占用了很多额外的不需要的时间。

+0

@ alexisdebriere的回答基本上是正确的。如果您能够明确指定渐变功能(在“?nls”中搜索“渐变”),则可以避免这种情况。 –

回答

1

在我看来,nls使用高斯牛顿算法,它需要雅可比计算,因此您可以看到雅可比值的数值计算。

您可以看到,调用是不完全一样的使用下面的代码:

Test = data.frame(x = c(5, 10, 15, 25), y = c(5, 8, 12, 16)) 

fun = function(x, a, b) { 
    cat("a =", sprintf("%0.10f",a), ", b =", sprintf("%0.10f",b), "\n") 
    a*(x**b) 
} 

nls(y ~ fun(x, a, b), data = Test, start = list(a = 1.613, b = 0.718), trace = TRUE) 

它只是打印更多的小数。雅克比安通过对所有参数做微小的扰动来估计。

a = 1.6130000000 , b = 0.7180000000 
a = 1.6130000000 , b = 0.7180000000 
a = 1.6130000240 , b = 0.7180000000 
a = 1.6130000000 , b = 0.7180000107 
0.7964401 : 1.613 0.718 
a = 1.6127231539 , b = 0.7177708205 
a = 1.6127231779 , b = 0.7177708205 
a = 1.6127231539 , b = 0.7177708312 
0.7960992 : 1.6127232 0.7177708 
a = 1.6126979985 , b = 0.7177761452 
a = 1.6126980225 , b = 0.7177761452 
a = 1.6126979985 , b = 0.7177761559 
0.7960992 : 1.6126980 0.7177761 
Nonlinear regression model 
    model: y ~ fun(x, a, b) 
    data: Test 
    a  b 
1.6127 0.7178 
residual sum-of-squares: 0.7961 

Number of iterations to convergence: 2 
Achieved convergence tolerance: 1.43e-06 

所以这些调用是nls强制计算雅可比。