Answers:
fitdistr
使用最大似然和优化技术来查找给定分布的参数。有时,尤其是对于t分布,如@ user12719所注意到的,优化形式为:
fitdistr(x, "t")
失败并显示错误。
在这种情况下,您应该通过提供起点和下限来开始寻找最佳参数,从而为优化器提供帮助:
fitdistr(x, "t", start = list(m=mean(x),s=sd(x), df=3), lower=c(-1, 0.001,1))
请注意,df=3
您对“最佳” df
可能是最好的猜测。提供此附加信息后,您的错误将消失。
几个摘录可以帮助您更好地了解以下方面的内部机制fitdistr
:
对于正态分布,对数正态分布,几何分布,指数分布和泊松分布,使用封闭形式的MLE(以及精确的标准误差),
start
不应提供。
...
对于以下命名分布,如果
start
省略或仅部分指定,则会计算出合理的起始值:“ cauchy”,“ gamma”,“ logistic”,“ negative binomal”(由mu和size参数化),“ t”和“ weibull” ”。请注意,如果拟合差,则这些起始值可能不够好:特别是除非拟合分布是长尾的,否则它们不能抵抗异常值。
set.seed(1234)
n <- 10
x <- rt(n, df=2.5)
make_loglik <- function(x)
Vectorize( function(nu) sum(dt(x, df=nu, log=TRUE)) )
loglik <- make_loglik(x)
plot(loglik, from=1, to=100, main="loglikelihood function for df parameter", xlab="degrees of freedom")
abline(v=2.5, col="red2")
如果您使用此代码,则会发现某些情况下存在明确定义的最大值,尤其是在样本量较大的情况下
让我们尝试一些模拟:
t_nu_mle <- function(x) {
loglik <- make_loglik(x)
res <- optimize(loglik, interval=c(0.01, 200), maximum=TRUE)$maximum
res
}
nus <- replicate(1000, {x <- rt(10, df=2.5)
t_nu_mle(x) }, simplify=TRUE)
> mean(nus)
[1] 45.20767
> sd(nus)
[1] 78.77813
显示估计值非常不稳定(从直方图看,估计值的相当大一部分处于为优化而指定的上限200)。
以更大的样本量重复:
nus <- replicate(1000, {x <- rt(50, df=2.5)
t_nu_mle(x) }, simplify=TRUE)
> mean(nus)
[1] 4.342724
> sd(nus)
[1] 14.40137
更好,但均值仍远高于2.5的真实值。
然后请记住,这是实际问题的简化版本,其中还必须估算位置和比例参数。
如果使用原因 -分布是要“稳固”,然后估计 数据中的数据很可能破坏鲁棒性。
在fitdistr的帮助中是以下示例:
fitdistr(x2, "t", df = 9)
表示您只需要df的值。但这假定了标准化。
为了获得更多控制权,他们还显示
mydt <- function(x, m, s, df) dt((x-m)/s, df)/s
fitdistr(x2, mydt, list(m = 0, s = 1), df = 9, lower = c(-Inf, 0))
其中参数为m =平均值,s =标准偏差,df =自由度
df
错误是导致错误的原因,正确的答案应该为找到它提供一些帮助。
df=9
在他们的例子中很好,而在这里却无关紧要。