Изменение кривой для предотвращения сингулярной градиентной матрицы при начальных оценках параметров

Я хочу использовать 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, поэтому проблем с начальными оценками параметров быть не должно, поскольку я определил их как а = 1, б = 0,5.

Читал в других темах, что кривую доработать удобно. Я думал о чем-то вроде log y=log a *(b^x), но не знаю, что делать со спецификацией функций. Любая идея?


person Vochmelka    schedule 16.02.2014    source источник
comment
Если я использую: (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))) Не знаю, поможет ли это.   -  person Mark Miller    schedule 17.02.2014
comment
Это интересно. Любой автоматический способ узнать, какими должны быть начальные значения для 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))). Тем не менее, я бы предпочел, чтобы все это происходило автоматически ...   -  person Vochmelka    schedule 17.02.2014


Ответы (1)


Я разверну свой комментарий до ответа.

Если я использую следующее:

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)))

or

(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, возможно потому, что 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()

введите описание изображения здесь

person Mark Miller    schedule 17.02.2014