我正在尝试使用nls使某些数据适合方波函数,但是由于某些原因,出现以下错误:
nlsModel中的错误(公式,MF,开始,wts,上部):
初始参数估计时的奇异梯度矩阵
我不知道为什么会这样,因为我已经能够将相同的数据拟合到具有相同数量参数的其他曲线上。我尝试更改初始值,但无济于事。我读过其他几篇也遇到同样错误的人的帖子,但是没有建议的更改对我有用。我的猜测是,这要么是真的很愚蠢(某种错别字,尽管我对此进行了两次和三次检查),要么超出了我有限的数学知识。
下面是一段代码,它再现了我的问题:
# 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
)
难道公式太复杂了吗?我这样做是为了使幅度,相位和周期等于“传统”正弦波函数定义。即,振幅=距中心线的高度;相位=水平移动,周期=“峰值”之间的距离,因为这是我最终希望从其他数据样本中获取的信息。
非常感谢您的帮助或见解。