Модельное комплексное уравнение в R - PullRequest
0 голосов
/ 04 мая 2018

У меня есть следующая модель:

$y(t) = C + A_{0}\exp^{(-\sigma t)}\cos(\omega_dt+\phi)$

который я кодировал в R как:

function(t,C,Ao,s,wd,ph) C + Ao * exp(-s*t) * cos(wd*t + ph)

Я хочу использовать это уравнение для формирования прогнозной модели.

Однако я не могу понять, как успешно выполнить или построить это уравнение.

  • Я пытался nls, но получал различные ошибки (в том числе те, которые предупреждали меня о singular gradient.

Я посмотрел здесь , но я не вижу, куда идти здесь, учитывая, что моя модель не работает.

Как мне смоделировать и построить график этой функции в R?


Что я пробовал:

LTI.func <- function(t,C,Ao,s,wd,ph) C + Ao * exp(-s*t) * cos(wd * t + ph)
mod <- nls(Y ~ LTI.func(t = I(scale(t)), C, Ao, s, wd, ph), 
           data = dat, 
           start = list(C = 1, Ao = 1, s = 1, w = 1, ph = 1))

Я понятия не имел, что starts выбрать, поэтому я попробовал несколько случайных, что привело к ошибкам. Даже когда я выбирал старты, руководствуясь тенденцией y (t) ~ t, которую я мог видеть, я всегда получал какую-то ошибку:

Error in nlsModel(formula, mf, start, wts) : 
  singular gradient matrix at initial parameter estimates

Error in nls(Y ~ LTI.func(I(scale(t)), C, Ao, s, wd, ph), data = dat  : 
  singular gradient

Обновление:

Вот пример набора данных:

dat <- data.frame(t = c(72, 25, 10, 88, 67, 63, 34, 41, 75, 13, 59, 8, 30, 52, 21),
                  Y = c(108.7, 157.5, 17.7, 175, 246.8, 233.5, 208.6, 246.5, 126.5, 
                        45.5, 214.1, 4.9, 184, 239.2, 113.3))

1 Ответ

0 голосов
/ 05 мая 2018

Это обнаружилось в закрытой очереди, но мне показалось, что оно достаточно хорошо сформировано, если плохо проверено на согласованность имен параметров. Вот мой шанс на решение. Сначала я попытался изменить аргумент функции на x, а когда это не сработало, попытался настроить начальные значения. В конце концов я решил масштабировать аргумент данных:

LTI.func <- function(x,C,Ao,s,wd,ph) {C + Ao * exp(-s*x) * cos(wd * x + ph)}
 mod <- nls(Y ~ LTI.func(x=t , C, Ao, s, wd, ph), data=data.frame(scale(dat)), 
                     start=list(C = 0,Ao = -1,s = 1,wd = 1,ph = 0))
 mod
#-------------
Nonlinear regression model
  model: Y ~ LTI.func(x = t, C, Ao, s, wd, ph)
   data: data.frame(scale(dat))
        C        Ao         s        wd        ph 
 0.288729 -0.986426  0.517128  2.002040  2.756004 
 residual sum-of-squares: 1.53608

Number of iterations to convergence: 18 
Achieved convergence tolerance: 0.0000038776

Для того, чтобы это было полезным «решением», потребуется обратное преобразование и построение графиков результатов относительно исходных значений или, возможно, построение преобразованных координат относительно теоретических. Я не был удивлен, что значение A0 было меньше нуля. Из данных, безусловно, видно, что тренд восходящий, и exp(-s*x) в целом будет нисходящим, если s*x будет положительным.

...