如何使用 R 将纸上定义的统计模型“翻译”到计算机上?
How can I “translate” a statistical model defined on paper to the computer using R?
I have initially posted this question on stats.stackexchange.com
,
but it was closed due to being focused on programming. Hopefully, I
can get any help here.
为了简单起见,我不会在这里放太多理论细节,但我的最终目标是使用 R
.
实现隐马尔可夫模型
虽然我对理论模型构建没问题,但是当我尝试实现它时,我意识到我对计算统计的基本知识一窍不通。我的问题就是这个方向。
令 and be random variables such that and , with and . If 表示分布,我如何计算
使用 R
?
我的意思是,这些分布(一个离散和一个连续)相乘的确切含义是什么?我如何使用 R
执行此操作?答案显然是 的函数,但它在我的代码中是如何表示的?
如果 is also discrete? For instance, , with 有什么变化吗?它将如何影响实现的代码?
我知道我的问题不是很具体,但我不知道如何开始。我的这个问题的目标是了解如何将我在纸上写的内容“翻译”到计算机上。
翻译
这些方程式描述了如何在给定 Y=y
的观察值以及参数 p
和 sigma
的值的情况下计算 X
的概率分布。最终,您想要实现一个函数 p_X_given_Y
,它的值为 Y
,return 是 X
的概率分布。一个好的起点是实现表达式的 RHS 中使用的两个函数。像,
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) {
# numerators: for each x \in X
ps <- sapply(c("0"=0,"1"=1),
function (x) { p_X(x) * p_Y_given_X(y, x) })
# divide out denominator
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
等。这只是实现它的一种方式,其想法是 return “X 的分布”,在本例中它只是一个命名的数字向量,其中名称(“0”、“1”)对应于 X 的支持,值对应于概率质量。
一些替代实现可能是:
- a
p_X_given_Y(x,y)
也取值 x
和 returns 相应的概率质量
- a
p_X_given_Y(y)
returns 另一个函数接受 x
参数和 returns 相应的概率质量(即概率质量函数)
I have initially posted this question on
stats.stackexchange.com
, but it was closed due to being focused on programming. Hopefully, I can get any help here.
为了简单起见,我不会在这里放太多理论细节,但我的最终目标是使用 R
.
虽然我对理论模型构建没问题,但是当我尝试实现它时,我意识到我对计算统计的基本知识一窍不通。我的问题就是这个方向。
令
使用 R
?
我的意思是,这些分布(一个离散和一个连续)相乘的确切含义是什么?我如何使用 R
执行此操作?答案显然是
如果
我知道我的问题不是很具体,但我不知道如何开始。我的这个问题的目标是了解如何将我在纸上写的内容“翻译”到计算机上。
翻译
这些方程式描述了如何在给定 Y=y
的观察值以及参数 p
和 sigma
的值的情况下计算 X
的概率分布。最终,您想要实现一个函数 p_X_given_Y
,它的值为 Y
,return 是 X
的概率分布。一个好的起点是实现表达式的 RHS 中使用的两个函数。像,
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) {
# numerators: for each x \in X
ps <- sapply(c("0"=0,"1"=1),
function (x) { p_X(x) * p_Y_given_X(y, x) })
# divide out denominator
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
等。这只是实现它的一种方式,其想法是 return “X 的分布”,在本例中它只是一个命名的数字向量,其中名称(“0”、“1”)对应于 X 的支持,值对应于概率质量。
一些替代实现可能是:
- a
p_X_given_Y(x,y)
也取值x
和 returns 相应的概率质量 - a
p_X_given_Y(y)
returns 另一个函数接受x
参数和 returns 相应的概率质量(即概率质量函数)