Логарифмическая вероятность гамма-распределения с масштабным параметром 1 может быть записана как:
(α−1)s−nlogΓ(α)
, где альфа — параметр формы, а s=∑logXi
— достаточная статистика.
Случайным образом нарисуйте образец n = 30 с параметром формы альфа = 4,5. Используя newton_search
и make_derivative
, найдите оценку максимального правдоподобия альфа. Используйте моментную оценку альфы, т. е. среднее значение x в качестве начального предположения. Функция логарифмического правдоподобия в R:
x <- rgamma(n=30, shape=4.5)
gllik <- function() {
s <- sum(log(x))
n <- length(x)
function(a) {
(a - 1) * s - n * lgamma(a)
}
}
Я создал функцию make_derivative следующим образом:
make_derivative <- function(f, h) {
(f(x + h) - f(x - h)) / (2*h)
}
Я также создал функцию newton_search
, которая включает в себя функцию make_derivative
; Однако мне нужно использовать newton_search
во второй производной функции логарифмического правдоподобия, и я не уверен, как исправить следующий код, чтобы он это сделал:
newton_search2 <- function(f, h, guess, conv=0.001) {
set.seed(2)
y0 <- guess
N = 1000
i <- 1; y1 <- y0
p <- numeric(N)
while (i <= N) {
make_derivative <- function(f, h) {
(f(y0 + h) - f(y0 - h)) / (2*h)
}
y1 <- (y0 - (f(y0)/make_derivative(f, h)))
p[i] <- y1
i <- i + 1
if (abs(y1 - y0) < conv) break
y0 <- y1
}
return (p[(i-1)])
}
Подсказка: вы должны применить newton_search
к первой и второй производным (полученным численно с использованием make_derivative
) логарифмического правдоподобия. Ваш ответ должен быть около 4,5.
когда я запускаю newton_search2(gllik(), 0.0001, mean(x), conv = 0.001)
, я получаю ответ вдвое больше, чем должен быть.