2016-08-08 3 views
1

일부 데이터에 잘린 정규 분포를 맞추려고합니다. 그러나, 나는 다음과 같은 오류로 실행되었습니다fitdistrplus를 사용하여 truncnorm 피팅

<simpleError in optim(par = vstart, fn = fnobj, fix.arg = fix.arg, obs = data,  gr = gradient, ddistnam = ddistname, hessian = TRUE, method = meth,  lower = lower, upper = upper, ...): non-finite finite-difference value [1]> 
Error in fitdist(testData, "truncnorm", start = list(a = 0, mean = 0.8, : 
    the function mle failed to estimate the parameters, 
       with the error code 100 

내가 뭘 잘못이야 모르겠어요 - 내가 초기 추측이 잘못 또는보다 높은 경우 어떤 경우에 문제가 피팅이있을 수 읽었습니다 실제 값이지만 여러 시작 값을 시도했지만 아무 것도 작동하지 않는 것 같습니다. 여기

내 데이터의 작은 샘플, 그리고 코드는 내가 오류를 가져 오는 데 사용 :

library(fitdistrplus) 
library(truncnorm) 
testData <- c(3.2725167726, 0.1501345235, 1.5784128343, 1.218953218, 1.1895520932, 
       2.659871271, 2.8200152609, 0.0497193249, 0.0430677458, 1.6035277181, 
       0.2003910167, 0.4982836845, 0.9867184303, 3.4082793339, 1.6083770189, 
       2.9140912221, 0.6486576911, 0.335227878, 0.5088426851, 2.0395797721, 
       1.5216239237, 2.6116576364, 0.1081283479, 0.4791143698, 0.6388625172, 
       0.261194346, 0.2300098384, 0.6421213993, 0.2671907741, 0.1388568942, 
       0.479645736, 0.0726750815, 0.2058983462, 1.0936704833, 0.2874115077, 
       0.1151566887, 0.0129750118, 0.152288794, 0.1508512023, 0.176000366, 
       0.2499423442, 0.8463027325, 0.0456045486, 0.7689214668, 0.9332181529, 
       0.0290242892, 0.0441181842, 0.0759601229, 0.0767983979, 0.1348839304 
) 

fitdist(testData, "truncnorm", start = list(a = 0, mean = 0.8, sd = 0.9)) 

답변

1

문제는 MLE 추정이 a 하한으로 매개 변수 mean 점점 부정적인 평가를 제공하는 것입니다 제로 경향이있다 (후자는 start 매개 변수 내에서 지정할 수 없습니다해야합니다,하지만 내 fix.arg) :

fitdist(testData, "truncnorm", fix.arg=list(a=-.5), 
     start = list(mean = mean(testData), sd = sd(testData))) 
fitdist(testData, "truncnorm", fix.arg=list(a=-.2), 
     start = list(mean = mean(testData), sd = sd(testData))) 
fitdist(testData, "truncnorm", fix.arg=list(a=-.15), 
     start = list(mean = mean(testData), sd = sd(testData))) 

하나의 가능성 큰 음의 값을 방지하기 위해 mean 위해 최적화 하한을 사용하는 것이다

fitdist(testData, "truncnorm", fix.arg=list(a=0), 
     start = list(mean = mean(testData), sd = sd(testData)), 
     optim.method="L-BFGS-B", lower=c(0, 0)) 

그러나, 이러한 추정 방법이 변경; 실제로 매개 변수에 대한 추가 제한 조건을 부과하고 다른 하한을 사용하여 다른 대답을 얻을 수 있습니다.

+0

이것은 내가 몇 가지 질문을 남겨 둡니다. 제가 작업하고있는 데이터는 0보다 낮을 수는 없지만, 평균값이 음수인지 아닌지에 대해 신경 쓰지는 않습니다. 내가 할 수있는대로 데이터 배포. 'a'가 0이 될 때 mle estimator가 음수가되는 것을 감안할 때, non-mle 추정을 사용하는 것이 더 좋을까요? 데이터 그 자체가 음수가 될 수 없다면'a'의 음수 값을 갖는 것이 합리적입니까? – mlinegar

+0

이것들은 매우 흥미로운 질문입니다, 나는 그들 앞에 나 자신을 조금 전에 비틀었고, 그들을 생각해 내는데 약간의 생각이 들었다. 그러나 통계적 특성 때문에 http://stats.stackexchange.com/에 더 적합하다고 생각합니다. 귀하의 사례를 함께 게시하면 확장 된 답변을 제공해 드리겠습니다 (지금 생각해 보면 이미 사용 가능할 것입니다). –

+0

고맙습니다. 방금 새 질문을 게시했습니다. http://stats.stackexchange.com/questions/229624/fitting-truncated-distributions-using-fitdistrplus-with-a-lower-bound-of-zero – mlinegar