【问题标题】:Fitting truncnorm using fitdistrplus使用 fitdistrplus 拟合 truncnorm
【发布时间】:2023-04-07 05:39:01
【问题描述】:

我正在尝试将截断的正态分布拟合到某些数据。但是,我遇到了以下错误:

<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))

【问题讨论】:

    标签: r model-fitting fitdistrplus


    【解决方案1】:

    问题在于,mle 估计器为参数mean 提供了越来越多的负估计,因为下限a 趋于零(请注意,后者不能在start 参数中指定,而应在@987654326 中指定@):

    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))
    

    但是,这会改变估算程序;实际上,您对参数施加了额外的约束,并且可能会以不同的下限获得不同的答案。

    【讨论】:

    • 这给我留下了几个问题 - 我正在使用的数据不能低于零,但我不一定关心平均值是否为负,因为我我只是想尽我所能拟合数据的分布。鉴于当a 变为零时,mle 估计量趋于负值,那么使用非 mle 估计会更好吗?如果数据本身不能为负数,那么负值 a 是否有意义?
    • 这些都是非常有趣的问题,因为我自己不久前偶然发现了它们,我花了一些心思才弄清楚它们。但是,我认为它们更适合stats.stackexchange.com,因为它们具有统计性​​质。如果您将它们与您的示例一起发布到那里,我很乐意为您提供扩展答案(现在我想到了,可能已经在那里可用)。
    • 谢谢,我刚刚在这里发布了新问题:stats.stackexchange.com/questions/229624/…
    • 好的,我在那里发布了答案。
    猜你喜欢
    • 2019-04-07
    • 2016-07-05
    • 2021-04-20
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 2019-05-22
    • 2019-12-28
    • 2019-12-03
    相关资源
    最近更新 更多