来自MASS库的fitdistr在拟合t分布时给出警告

时间:2016-02-10 14:44:06

标签: r optimization statistics distribution mle

我正在尝试重现David Ruppert的“金融工程统计和数据分析”中的以下示例,该示例使学生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

从R的帮助文件中可以看出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

拟合参数在可接受的标准误差范围内,除了均值和sd之外,我得到了df

有人可以告诉我:

  1. 为什么MASS::fitdistr会产生警告,而fGarch::optim优化会成功而没有警告?
  2. 为什么df输出中没有MASS::fitdistr
  3. 是否可以在没有警告的情况下对此数据运行MASS:fitdistr并获取df
  4. 声明:

    在没有回答herehere

    的情况下,几次问了类似的问题

1 个答案:

答案 0 :(得分: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)可以用于拟合自由度参数。