2014-02-16 37 views
5

我想使用y=a^(b^x)以适应下面的数据,修改曲线,以防止单数梯度矩阵在初始参数估计

y <- c(1.0385, 1.0195, 1.0176, 1.0100, 1.0090, 1.0079, 1.0068, 1.0099, 1.0038) 
x <- c(3,4,5,6,7,8,9,10,11) 
data <- data.frame(x,y) 

当我使用非线性最小二乘法,

f <- function(x,a,b) {a^(b^x)} 
(m <- nls(y ~ f(x,a,b), data = data, start = c(a=1, b=0.5))) 

它产生一个错误:初始参数估计的奇异梯度矩阵。结果大致为a = 1.1466,b = 0.6415,所以初始参数估计不应该存在问题,因为我已经将它们定义为a = 1,b = 0.5。

我已经在其他主题中看过修改曲线很方便。我在想像log y=log a *(b^x)之类的东西,但我不知道如何处理函数规范。任何想法?

+0

如果我使用:'(M < - NLS(Y〜F(X,A,B), data = data,start = c(a = 0.9,b = 0.6)))'我没有收到错误。如果我使用:(m < - nls(y〜f(x,a,b),data = data,start = c(a = 1.2,b = 0.4)),我会得到相同的答案''我不知道如果这有帮助。 –

+0

这很有趣。任何自动的方法来找出什么应该是a和b的起始值?___我想我可以使用好的a^b^3 = 1.0385,即a^b = 1.0385 ^(1/3)= 1.01267',它对'a = 1.01267'和'b = 1'有效。这与'(m < - nls(y〜f(x,a,b),data = data,start = c(a = 1.01267,b = 1.0)))'一起工作。不过,我宁愿自动把它全部... – Vochmelka

回答

4

我会将我的评论扩展为答案。

如果我使用以下内容:

y <- c(1.0385, 1.0195, 1.0176, 1.0100, 1.0090, 1.0079, 1.0068, 1.0099, 1.0038) 
x <- c(3,4,5,6,7,8,9,10,11) 
data <- data.frame(x,y) 

f <- function(x,a,b) {a^b^x} 

(m <- nls(y ~ f(x,a,b), data = data, start = c(a=0.9, b=0.6))) 

(m <- nls(y ~ f(x,a,b), data = data, start = c(a=1.2, b=0.4))) 

我获得:

Nonlinear regression model 
    model: y ~ f(x, a, b) 
    data: data 
    a  b 
1.0934 0.7242 
residual sum-of-squares: 0.0001006 

Number of iterations to convergence: 10 
Achieved convergence tolerance: 3.301e-06 

如果我使用1作为a起始值I总是获得误差,也许是因为1提高到了任何值都是1

至于自动生成起始值,我不熟悉一个程序来做到这一点。我已阅读的一种方法是模拟曲线并使用起始值生成一条似乎与您的数据相近的曲线。

下面是使用以上参数估计值使用以下代码生成的图。我承认也许线的右下部分可以装好一点:

setwd('c:/users/mmiller21/simple R programs/') 

jpeg(filename = "nlr.plot.jpeg") 

plot(x,y) 
curve(1.0934^(0.7242^x), from=0, to=11, add=TRUE) 

dev.off() 

enter image description here