답변:
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
여기에 왜 예제가 좋고 관련이 없는지 알 수 있습니다.