以符号方式计算 (r)yacas 中的 Hessian
Symbolically calculate the Hessian in (r)yacas
背景:
我正在使用 Ryacas
包,试图找出 MLE
估计量的大样本方差的符号表达式。
为此,我需要似然函数的(逆)Hessian
矩阵。我没有 mathematica(而且在线版本对我来说似乎太麻烦了),因此我正在尝试使用 Ryacas
包,它是 YACAS
计算机代数系统的接口。
问题:
但是,我似乎无法弄清楚如何计算 Hessian
。使用此处的指南:https://cran.r-project.org/web/packages/Ryacas/vignettes/high-level.html 给我一个错误。这是一个最小的可复制示例(取自该指南)
L <- yac_symbol("x^2 * (y/4) - a*(3*x + 3*y/2 - 45)")
Hessian(L)
Error in Hessian(L) : could not find function "Hessian"
当我尝试另一种方式时,即使用(新的?)界面
L <- yac_symbol("x^2 * (y/4) - a*(3*x + 3*y/2 - 45)")
y_fn(L, "HessianMatrix")
我似乎也找不到可用的答案,只是 HessianMatrix((x^2*y)/4-a*(3*x+(3*y)/2-45))
有人知道如何解决这个问题吗?将不胜感激!
谢谢
错误 Error in Hessian(L) : could not find function "Hessian"
是由于 Hessian
函数不是 Ryacas
包的一部分,而是 R 中 numDeriv
包的一部分。
下面还有Hessian
函数在R中的文档:
https://www.rdocumentation.org/packages/numDeriv/versions/2016.8-1.1/topics/hessian
希望这能解决您的问题。所以请先安装numDeriv
包,然后再使用Hessian
功能。
我也试过用上面的例子,结果如下:
library(Ryacas)
library(numDeriv)
L <- yac_symbol("x^2 * (y/4) - a*(3*x + 3*y/2 - 45)")
Hessian(L)
输出:
{}
输出为空集,不过我想你可以参考一下Hessian
函数的文档,一定会有帮助。
library(Ryacas)
yac_str("HessianMatrix(x^2 * (y/4) - a*(3*x + 3*y/2 - 45), {x,y})")
# "{{y/2,x/2},{x/2,0}}"
yac_str("PrettyForm(HessianMatrix(x^2 * (y/4) - a*(3*x + 3*y/2 - 45), {x,y}))") %>% cat
# / \
# | / y \ / x \ |
# | | - | | - | |
# | \ 2 / \ 2 / |
# | |
# | / x \ ( 0 ) |
# | | - | |
# | \ 2 / |
# \ /
以下是您可以使用 Ryacas v1.1.1 执行的操作:
> library(Ryacas)
> packageVersion("Ryacas")
[1] ‘1.1.1’
> x <- ysym("x")
> y <- ysym("y")
> a <- ysym("a")
> L <- x^2 * (y/4) - a*(3*x + 3*y/2 - 45)
> H <- Hessian(L, c("x", "y", "a"))
> H
{{ y/2, x/2, -3},
{ x/2, 0, (-3)/2},
{ -3, (-3)/2, 0}}
> as_r(H)
expression(rbind(c(y/2, x/2, -3), c(x/2, 0, -3/2), c(-3, -3/2,
0)))
> eval(as_r(H), list(x = 2, y = 2, a = 2))
[,1] [,2] [,3]
[1,] 1 1.0 -3.0
[2,] 1 0.0 -1.5
[3,] -3 -1.5 0.0
背景:
我正在使用 Ryacas
包,试图找出 MLE
估计量的大样本方差的符号表达式。
为此,我需要似然函数的(逆)Hessian
矩阵。我没有 mathematica(而且在线版本对我来说似乎太麻烦了),因此我正在尝试使用 Ryacas
包,它是 YACAS
计算机代数系统的接口。
问题:
但是,我似乎无法弄清楚如何计算 Hessian
。使用此处的指南:https://cran.r-project.org/web/packages/Ryacas/vignettes/high-level.html 给我一个错误。这是一个最小的可复制示例(取自该指南)
L <- yac_symbol("x^2 * (y/4) - a*(3*x + 3*y/2 - 45)")
Hessian(L)
Error in Hessian(L) : could not find function "Hessian"
当我尝试另一种方式时,即使用(新的?)界面
L <- yac_symbol("x^2 * (y/4) - a*(3*x + 3*y/2 - 45)")
y_fn(L, "HessianMatrix")
我似乎也找不到可用的答案,只是 HessianMatrix((x^2*y)/4-a*(3*x+(3*y)/2-45))
有人知道如何解决这个问题吗?将不胜感激!
谢谢
错误 Error in Hessian(L) : could not find function "Hessian"
是由于 Hessian
函数不是 Ryacas
包的一部分,而是 R 中 numDeriv
包的一部分。
下面还有Hessian
函数在R中的文档:
https://www.rdocumentation.org/packages/numDeriv/versions/2016.8-1.1/topics/hessian
希望这能解决您的问题。所以请先安装numDeriv
包,然后再使用Hessian
功能。
我也试过用上面的例子,结果如下:
library(Ryacas)
library(numDeriv)
L <- yac_symbol("x^2 * (y/4) - a*(3*x + 3*y/2 - 45)")
Hessian(L)
输出:
{}
输出为空集,不过我想你可以参考一下Hessian
函数的文档,一定会有帮助。
library(Ryacas)
yac_str("HessianMatrix(x^2 * (y/4) - a*(3*x + 3*y/2 - 45), {x,y})")
# "{{y/2,x/2},{x/2,0}}"
yac_str("PrettyForm(HessianMatrix(x^2 * (y/4) - a*(3*x + 3*y/2 - 45), {x,y}))") %>% cat
# / \
# | / y \ / x \ |
# | | - | | - | |
# | \ 2 / \ 2 / |
# | |
# | / x \ ( 0 ) |
# | | - | |
# | \ 2 / |
# \ /
以下是您可以使用 Ryacas v1.1.1 执行的操作:
> library(Ryacas)
> packageVersion("Ryacas")
[1] ‘1.1.1’
> x <- ysym("x")
> y <- ysym("y")
> a <- ysym("a")
> L <- x^2 * (y/4) - a*(3*x + 3*y/2 - 45)
> H <- Hessian(L, c("x", "y", "a"))
> H
{{ y/2, x/2, -3},
{ x/2, 0, (-3)/2},
{ -3, (-3)/2, 0}}
> as_r(H)
expression(rbind(c(y/2, x/2, -3), c(x/2, 0, -3/2), c(-3, -3/2,
0)))
> eval(as_r(H), list(x = 2, y = 2, a = 2))
[,1] [,2] [,3]
[1,] 1 1.0 -3.0
[2,] 1 0.0 -1.5
[3,] -3 -1.5 0.0