t分布のパラメーター、つまり正規分布の「平均」と「標準偏差」に対応するパラメーターをどのように適合させますか。私はそれらがt分布の「平均」と「スケーリング/自由度」と呼ばれていると思いますか?
次のコードは、多くの場合「最適化に失敗しました」エラーになります。
library(MASS)
fitdistr(x, "t")
最初にxをスケーリングするか、確率に変換する必要がありますか?それを行うのに最適な方法は?
t分布のパラメーター、つまり正規分布の「平均」と「標準偏差」に対応するパラメーターをどのように適合させますか。私はそれらがt分布の「平均」と「スケーリング/自由度」と呼ばれていると思いますか?
次のコードは、多くの場合「最適化に失敗しました」エラーになります。
library(MASS)
fitdistr(x, "t")
最初にxをスケーリングするか、確率に変換する必要がありますか?それを行うのに最適な方法は?
回答:
fitdistr
最尤法と最適化手法を使用して、特定の分布のパラメーターを見つけます。@ user12719が気づいたように、特にt分布の場合、次の形式の最適化が行われることがあります。
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 binomial"(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 =自由度になります
\mu
と\sigma
同様。ところで、かなり前に+1。
df
エラーの原因はエラーの原因であり、正しい答えはそれを見つけるためのレシピを提供するはずです。
df=9
その例で良いのか、ここでは無関係であることがわかります。