Как включить параметр "а" в поли подход в NLS? - PullRequest
1 голос
/ 05 апреля 2020

Я хочу использовать poly в экспоненциальной nls функции. Рассмотрим следующие две модели.

## model 1
nls(y ~ exp(a + b*x), data=dat, start=list(a=0, b=0))
#           a           b  ## coefs
# -4.13220156  0.05972285 

## model 2
nls(y ~ exp(a + b*x + c*I(x^2)), data=dat, start=list(a=0, b=0, c=0))
#          a          b          c 
# -3.0603943  0.0300680  0.0001941 

После этого ответа я смог решить эту проблему без параметра a.

nls(y ~ exp(b*x), data=dat, start=list(b=0))
#       b 
# 0.01071 
nls(y ~ exp(poly(x, 1, raw=T) %*% coef), data=dat, start=list(coef=0))
#    coef 
# 0.01071 

nls(y ~ exp(b*x + c*I(x^2)), data=dat, start=list(b=0, c=0))
#          b          c 
# -0.0562947  0.0007633 
nls(y ~ exp(poly(x, 2, raw=T) %*% coef), data=dat, start=list(coef=rep(0, 2)))
#      coef1      coef2 
# -0.0562947  0.0007633

Однако я не смог ' t найти способ включить параметр a для воспроизведения модель 1 и модель 2 сверху с poly.

Мои неудачные попытки до сих пор

nls(y ~ exp(c(a, poly(x, 2, raw=T)) %*% coef), data=dat, 
    start=list(coef=setNames(rep(0, 3), letters[1:3])))
nls(y ~ exp(cbind(a, poly(x, 2, raw=T)) %*% coef), data=dat, 
    start=setNames(replicate(3, list(0)), letters[1:3]))
nls(y ~ exp(cbind(as.matrix(a), poly(x, 2, raw=T)) %*% coef), data=dat, 
    start=list(coef=setNames(replicate(3, list(0)), letters[1:3])))
nls(y ~ a*exp(poly(x, 2, raw=T) %*% coef), data=dat, 
    start=list(coef=setNames(replicate(3, list(0)), letters[1:3])))
nls(y ~ exp(a*lapply(coef, `[`, 1) + poly(x, 2, raw=T) %*% lapply(coef, `[`, -1)), 
    data=dat, start=list(coef=setNames(rep(0, 3), letters[1:3])))
nls(y ~ a*lapply(coef, `[`, 1)*exp(poly(x, 2, raw=T) %*% lapply(coef, `[`, -1)), 
    data=dat, start=list(coef=setNames(rep(0, 3), letters[1:3])))

выдают похожие сообщения об ошибках:

Error in nls(y ~ exp(c(a, poly(x, 2, raw = T)) %*% coef), data = dat,  : 
  parameters without starting value in 'data': a

Как Могу ли я включить параметр a в poly подходе?


Данные

set.seed(42)
dat <- data.frame(y=sort(rexp(100, 1) + rnorm(100)), x=1:100)

1 Ответ

1 голос
/ 05 апреля 2020

Пусть coef будет полным вектором коэффициента, включая a и cbind 1 к poly:

nls(y ~ exp(cbind(1, poly(x, 2, raw = TRUE)) %*% coef), data = dat,
  start = list(coef = numeric(3)))

или просто добавьте a к poly:

nls(y ~ exp(a + poly(x, 2, raw = TRUE) %*% coef), data = dat,
  start = list(a = 0, coef = numeric(2)))
...