2016-02-10 5 views
0

Я пытаюсь воспроизвести следующий пример из «Статистики и анализа данных для финансовой инженерии» Дэвида Рупперта, который подходит для t-распределения студентов по исторической ставке без риска:fitdistr из библиотеки MASS дает предупреждения при подключении t-распределения

library(MASS) 
data(Capm, package = "Ecdat") 
x <- Capm$rf 
fitt <- fitdistr(x,"t", start = list(m=mean(x),s=sd(x)), df=3) 
as.numeric(fitt$estimate) 
0.437310595161651 0.152205764779349 

выход сопровождается следующими предупреждениями сообщение:

Предупреждение сообщение:

In log(s): NaNs producedWarning message: 
In log(s): NaNs producedWarning message: 
In log(s): NaNs producedWarning message: 
In log(s): NaNs producedWarning message: 
In log(s): NaNs producedWarning message: 
In log(s): NaNs producedWarning message: 
In log(s): NaNs producedWarning message: 
In log(s): NaNs producedWarning message: 
In log(s): NaNs produced 

Он появляется из файла справки Тл АиР hat MASS::fitdistr использует максимальную вероятность для нахождения оптимальных параметров. Однако, когда я делаю оптимизацию вручную (той же книги), все идет гладко, и нет никаких предупреждений:

library(fGarch) 
loglik_t <- function(beta) {sum(- dt((x - beta[1])/beta[2], 
             beta[3], log = TRUE) + log(beta[2]))} 

start <- c(mean(x), sd(x), 5) 
lower <- c(-1, 0.001, 1) 
fit_t <- optim(start, loglik_t, hessian = T, method = "L-BFGS-B", lower = lower) 
fit_t$par 
0.44232633269102 0.163306955396773 4.12343777572566 

Подобранные параметры находятся в пределах допустимых стандартных ошибок, и, кроме того, означает и сд я получил df.

Может кто-нибудь посоветовать мне, пожалуйста:

  1. Почему MASS::fitdistr производит предупреждения, тогда как оптимизация с помощью fGarch::optim удается без предупреждения?
  2. Почему нет df в MASS::fitdistr продукции?
  3. Есть ли способ запустить MASS:fitdistr по этим данным без предупреждения и получите df?

Отказ от ответственности:

подобный вопрос был задан несколько раз без ответа here и here

ответ

2

Вы не передавая lower аргумент функции fitdistr, которая ведет его, чтобы сделать поиск в положительной и отрицательный домен. Пропустив lower аргумент функционировать

fitt <- fitdistr(x,"t", start = list(m=mean(x),s=sd(x)), df=3, lower=c(-1, 0.001)) 

вы получаете не NaNs не -как вы сделали в вашей ручной оптимизации.

РЕДАКТИРОВАТЬ:

fitt <- fitdistr(x,"t", start = list(m=mean(x),s=sd(x),df=3),lower=c(-1, 0.001,1)) 

возвращает нецелая степень свободы результата. Однако, я думаю, округленное значение этого параметра, которое равно round(fitt$estimate['df'],0), может использоваться для установленных параметров степени свободы.

+0

Спасибо, предупреждения исчезли! Как насчет получения 'df'? –

+0

'fitt <- fitdistr (x," t ", start = list (m = mean (x), s = sd (x), df = 3), lower = c (-1, 0.01))', но он возвращает не целое число 'df'result. Может быть, это может помочь? – submartingale