我不明白参数边界上的 fitHMM() 错误

问题描述 投票:0回答:1

当使用 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 

我不明白错误的意思,也不明白如何解决它。

r hidden-markov-models
1个回答
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
的前两项是平均值,最后两项是浓度参数。

© www.soinside.com 2019 - 2024. All rights reserved.