当使用 fitHMM() 获取动物运动数据时,我收到此错误:
Error in n2w(Par0[i], p$bounds, NULL, NULL, nbStates, inputs$estAngleMean, :
Check the parameter bounds for angle (the initial parameters should be strictly between the bounds of their parameter space).
这是我的代码:
stateNames <- c("encamped", "exploratory")
dist = list(step = "gamma", angle = "vm")
Par0_m1=list(step=c(0.013,0.9216,0.01,1.11,0.01,0.004),
angle=c(1,1))
m1 <-fitHMM(data=dataM, nbStates=2,
dist=dist, Par0=Par0_m1,
estAngleMean = list(angle=FALSE),
stateNames = stateNames)
m1 有一个输出:
step parameters:
----------------
encamped exploratory
mean 0.013173673 0.915614546
sd 0.009823547 1.115597292
zeromass 0.010918283 0.004483016
angle parameters:
-----------------
encamped exploratory
mean 0 0
concentration 0 0
然后我尝试使用这些值来拟合第二个更复杂的模型:
# Formula for transition probabilities
formula <- ~ Temp*cosinor(hour, period = 24)
# initial parameters obtained from m1
Par0_m2 <- getPar0(model=m1, formula=formula)
m2 <- fitHMM(data=dataM, nbStates=2,
dist=dist, Par0=Par0_m2$Par,
beta0=Par0_m2$beta, stateNames = stateNames,
formula=formula)
正是在此时,在尝试创建 m2 时,发生了错误。
我尝试调整初始angleCon0值并重新运行两个模型 - 如果angleCon0 = (0,0)那么当我尝试运行m1时也会发生错误,如果angleCon0 = (0,1)再次发生m1错误,如果anglecon0=(1,1) 那么我可以成功运行 m1 (但仍然无法运行 m2)。我不明白那里发生了什么,为什么浓度不能以 0 值运行?此外,为什么 m2 不能使用成功允许 m1 运行的值来运行?;
我还检查了 Par0_m2$Par:
print(Par0_m2$Par
$step
mean_1 mean_2 sd_1 sd_2 zeromass_1
0.013173673 0.915614546 0.009823547 1.115597292 0.010918283
zeromass_2
0.004483016
$angle
concentration_1 concentration_2
0 0
我不明白错误的意思,也不明白如何解决它。
von Mises 分布的浓度参数必须严格为正,因此传递到
fitHMM()
的起始值不能为零。目前尚不清楚为什么在第一个模型中两个转角浓度被估计为零 (m1
),但 getPar0()
只是复制这些值并将其传递给第二个模型的 fitHMM()
。这会导致您遇到错误。
一种解决方案是手动编辑
Par0_m2$Par$angle
将起始值设置为非零的值,例如:
Par0_m2$Par$angle <- c(0.1, 1)
但是,研究为什么浓度估计为零可能也是一个好主意。我的猜测是,数据中的转动角度在 pi 处有一个峰值(即方向上有许多反转),但这无法正确捕获,因为默认情况下,momentuHMM 中的平均转动角度固定为零。您可以使用选项
estAngleMean = list(angle=TRUE)
在两个模型中更改此设置。然后,您还需要为两种状态下的平均转向角度添加两个起始值。也许是这样的:
Par0_m1=list(step=c(0.013,0.9216,0.01,1.11,0.01,0.004),
angle=c(pi, 0, 0.5, 0.5))
其中
angle
的前两项是平均值,最后两项是浓度参数。