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