Символически рассчитать гессиан в (г) яках - PullRequest
1 голос
/ 25 октября 2019

Справочная информация: Я использую пакет 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))

Кто-нибудь есть идеи, как это исправить? Буду очень признателен!

Спасибо

Ответы [ 3 ]

2 голосов
/ 28 октября 2019
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 /        |
# \              /

Ссылка: yacas.readthedocs

0 голосов
/ 08 ноября 2019

Вот что вы можете сделать с 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
0 голосов
/ 27 октября 2019

Ошибка Error in Hessian(L) : could not find function "Hessian" связана с тем, что функция Hessian не является частью пакета Ryacas, а является частью пакета numDeriv в R.

Также ниже приведенадокументация функции 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, и она определенно поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...