我最初在
stats.stackexchange.com
上发布了这个问题,但由于问题集中在编程上而被关闭。希望在这里能得到一些帮助。
为了简化,我不会在这里放很多理论细节,但我的最终目标是使用R
实现一个隐马尔可夫模型。
虽然我对理论模型的构建没有问题,但当我尝试实现它时,我意识到自己对计算统计学的一些基本知识并不了解。我的问题就是朝这个方向提出的。
使用R
?
我的意思是,这些分布(一个离散,一个连续)的乘法具体意味着什么?我如何使用R
来实现这个?答案显然是的函数,但在代码中如何表示呢?
如果也是离散的,会有什么变化吗?例如,
,其中
。这会如何影响实现的代码?
我知道我的问题不够具体,但我对如何开始感到非常迷茫。我提这个问题的目的是理解如何将我在纸上写的内容“翻译”到计算机上。
回答:
翻译
这些方程描述了如何计算给定观察值Y=y
和参数p
和sigma
的值时X
的概率分布。最终,你希望实现一个函数p_X_given_Y
,它接受Y
的一个值并返回X
的概率分布。开始的一个好方法是实现表达式右侧使用的两个函数。比如,
p_X <- function (x, p=0.5) { switch(as.character(x), "0"=p, "1"=1-p, 0) }p_Y_given_X <- function (y, x, sigma=1) { dnorm(y, x, sd=sigma) }
请注意,这里p
和sigma
是任意选取的。这些函数然后可以用来定义p_X_given_Y
函数:
p_X_given_Y <- function (y) { # 分子:对于每个 x \in X ps <- sapply(c("0"=0,"1"=1), function (x) { p_X(x) * p_Y_given_X(y, x) }) # 除以分母 ps / sum(ps)}
可以像这样使用:
> p_X_given_Y(y=0)# 0 1 # 0.6224593 0.3775407> p_X_given_Y(y=0.5)# 0 1 # 0.5 0.5 > p_X_given_Y(y=2)# 0 1 # 0.1824255 0.8175745
这些数字应该具有直观的意义(给定p=0.5
):Y=0
更可能来自X=0
,Y=0.5
同样可能来自X=0
或X=1
,等等。这是实现它的一种方式,其想法是返回“X的分布”,在这种情况下,它只是一个命名数值向量,其中名称(”0″, “1”)对应于X的支持,值对应于概率质量。
一些替代实现方式可能是:
- 一个
p_X_given_Y(x,y)
,它也接受一个x
的值并返回相应的概率质量 - 一个
p_X_given_Y(y)
,它返回另一个接受x
参数并返回相应概率质量的函数(即,概率质量函数)