Подгонка прямоугольной формы: матрица сингулярного градиента при начальных оценках параметров - PullRequest
0 голосов
/ 18 октября 2019

Я пытаюсь подогнать некоторые данные к прямоугольной функции с помощью nls, но по какой-то причине я получаю следующую ошибку:

Ошибка в nlsModel (формула, mf, start,wts, upper):
матрица сингулярного градиента при первоначальных оценках параметровпараметров. Я попытался изменить начальные значения, но это не помогает. Я прочитал несколько других сообщений людей, получающих эту же ошибку, но ни одно из предложенных изменений не сработало для меня. Я предполагаю, что это либо что-то действительно глупое (какая-то опечатка, хотя я проверял дважды и трижды на это), либо что-то, что находится за пределами моих ограниченных математических знаний.

Ниже приведен фрагмент кода, который повторяет мою проблему:

# Data example
data <- c(0.87, -1.55, 0.09, -0.59, 0.06, 0.20, 1.55, 1.44
        ,-1.38, 0.35, -1.12, -1.06, -0.54, -0.88, 0.28, 1.34
        ,-0.26, 1.20)
loc <- c(10, 11, 12, 13, 14, 15, 1, 2, 3, 16, 17, 18, 4, 5 , 6 , 7 , 8 , 9)
time <- c(13, 13, 13, 17, 17, 17, 1, 1, 1, 21, 21, 21, 5, 5, 5, 9, 9, 9)
df <- data.frame(cbind(data,loc,time))
gd <- nlme::groupedData(data ~ time | loc, data = df)

arccot <- function(x){
  y = atan(1/x)
  return(y)
}

# Initial value for amplitude
amp_init <- abs(max(gd$data) - min(gd$data))/2
# Model fitting
nls.model = nls(data ~ 2*(amp/2+ amp/3*(atan(sin(2*pi*time/per + phase))+
                                        arccot(sin(2*pi*time/per + phase))))
                , start = list(amp = amp_init, phase = 0, per = 40)
                , algorithm = "port"
                , data = gd
)

Может быть, формула слишком запутанная? Я сделал это так, чтобы амплитуда, фаза и период были эквивалентны «традиционным» определениям синусоидальной функции. То есть амплитуда = высота от центральной линии;Фаза = горизонтальный сдвиг и период = расстояние между «пиками», потому что это информация, которую я в конечном итоге захочу получить из других выборок данных.
Я был бы очень признателен за любую помощь или понимание.

...