【问题标题】:Fitting distributions in R and Matlab give very different resultsR 和 Matlab 中的拟合分布给出了非常不同的结果
【发布时间】:2020-09-16 22:30:57
【问题描述】:

我正在将波高数据集 (m) 拟合到广义帕累托分布。我已经选择了 0.15m 的阈值。我正在从 Matlab 过渡到 R,所以我想比较两个程序的结果。我知道这两个程序不会提供相同的确切答案,但我希望得到的结果有点接近。

当然,对于两个配件,我使用了相同的数据和相同的阈值。两种方法都通过 MLE 估计参数。在 Matlab 中,fitdist 函数不估计阈值。假设它是已知的(在本例中为 0.15m),并在调用它之前从数据中减去(我已经这样做了)。而在 R 中,阈值是输入的一部分。

我使用的函数是: MATLAB: fitdist(data_above_threshold,'Generalized Pareto') 回复: fevd(data,threshold =0.15,type = 'GP',method = "MLE")。 (extRemes 包)

在 Matlab 中我得到: Shape:-1.0301 Scale:0.7534 在 R 中我得到 Shape:-0.5848505 Scale:0.3620191

我在这里附上数据,以便您自己查看结果:

c(0.194101337780203, 0.289791483274648, 0.313940773547535, 0.184577674010614, 
0.102266008573448, 0.045464156804826, 0.0486387113946889, 0.143761972140945, 
0.267342847246331, 0.242966803074167, 0.069386693178437, 0.0099771715681416, 
0.00736950172646855, 0.056121590070795, 0.0759625562574393, 0.145009118586962, 
0.258045937376017, 0.379926158236833, 0.236844447793717, 0.0861664817248564, 
0.0503393656392586, 0.156233436601121, 0.118138781522764, 4.44089209850063e-16, 
4.44089209850063e-16, 4.44089209850063e-16, 4.44089209850063e-16, 
0.0442170103588082, 4.44089209850063e-16, 4.44089209850063e-16, 
4.44089209850063e-16, 4.44089209850063e-16, 0.0143988726040223, 
0.148183673176825, 0.197729400168618, 0.0143988726040223, 4.44089209850063e-16, 
4.44089209850063e-16, 4.44089209850063e-16, 0.026416829265647, 
0.133558046673528, 0.209180472082052, 0.236050809146251, 0.0976175536382913, 
0.0292512530065965, 0.101812500774896, 0.174260371593558, 0.219271020599832, 
0.463144839271102, 0.579809720448572, 0.533211794147367, 0.354756475417204, 
0.360085192050189, 0.632756755929504, 0.651577329569406, 0.413372358380034, 
0.39353139219339, 0.343985665201597, 0.0630375839987112, 4.44089209850063e-16, 
4.44089209850063e-16, 4.44089209850063e-16, 4.44089209850063e-16, 
4.44089209850063e-16, 0.0486387113946889, 0.0434233717113424, 
4.44089209850063e-16, 4.44089209850063e-16, 4.44089209850063e-16, 
0.0566884748189849, 0.147730165378273, 0.175734271938852, 0.0827651732357175, 
4.44089209850063e-16, 4.44089209850063e-16, 4.44089209850063e-16, 
4.44089209850063e-16, 4.44089209850063e-16, 4.44089209850063e-16, 
0.0385481628769098, 0.0378679011790819, 0.0463711724019298, 0.0200677200859207, 
4.44089209850063e-16, 4.44089209850063e-16, 4.44089209850063e-16, 
4.44089209850063e-16, 4.44089209850063e-16, 0.0956901454944461, 
0.128909591738371, 0.141154302299272, 0.0459176646033779, 4.44089209850063e-16, 
0.0285709913087686, 0.251696828196291, 0.642847304447283, 0.731394702114536, 
0.603732256822183, 0.427997984883332, 0.635251048821539)

所以,我的问题是:如果两者都使用 MLE 来估计参数,那么为什么结果会如此不同?那么哪种拟合更可靠,或者您推荐使用哪一种?

【问题讨论】:

    标签: r matlab data-fitting


    【解决方案1】:

    我认为问题在于您的数据暗示了某种多模态,而 Matlab 使用的起始值不是最理想的。

    数据的经验密度图:

    plot(density(x, bw = "SJ"))
    

    首先让我们绘制 R 拟合:

    library(SpatialExtremes)
    library(extRemes)
    plot(fevd(x,threshold =0.15,type = 'GP',method = "MLE"))
    

    左下角的图显示我们已经实现了不错的拟合。 (请注意,此图中的内核密度估计使用了与上述不同的带宽。)

    现在我们使用您的 Matlab 结果作为起始值:

    fevd(x,threshold =0.15,type = 'GP',method = "MLE", 
         initial = list(shape = -1.0301, scale = 0.7534))
    #fevd(x = x, threshold = 0.15, type = "GP", method = "MLE", 
    #    initial = list(shape = -1.0301, scale = 0.7534))
    #
    #[1] "Estimation Method used: MLE"
    #
    #
    # Negative Log-Likelihood Value:  -18.74149 
    #
    #
    # Estimated parameters:
    #     scale      shape 
    # 0.6242056 -1.0736348 
    #
    # Standard Error Estimates:
    #      scale       shape 
    #0.000000020 0.001368606 
    #
    # Estimated parameter covariance matrix.
    #              scale         shape
    #scale  4.000000e-16 -2.598691e-17
    #shape -2.598691e-17  1.873082e-06
    #
    # AIC = -33.48297 
    #
    # BIC = -30.5515 
    #Warning messages:
    #1: In log(z) : NaNs produced
    #2: In log(z) : NaNs produced
    plot(fevd(x,threshold =0.15,type = 'GP',method = "MLE", 
              initial = list(shape = -1.0301, scale = 0.7534)))
    #Warning messages:
    #1: In log(z) : NaNs produced
    #2: In log(z) : NaNs produced
    

    我们可以清楚地看到拟合更差,并且存在错误收敛或局部最小值问题。这些警告进一步降低了我们对这种拟合的信心。我建议您尝试使用不同起始值的 Matlab。

    【讨论】:

    • 感谢您的回答! R 拟合显示比 Matlab 提供的要好,但这意味着 Matlab 并不总是提供可靠的拟合?当您说起始值时,您指的是使用不同的数据集?
    • 不,您使用数字优化器来拟合分布模型。数值优化器需要从哪里开始优化的值。我指的是那些。根据文档,fevd 有一种非常复杂的方法来寻找好的起始值。
    • 哦,好的。所以这意味着R的结果比Matlab的结果更可靠?
    • 我不喜欢笼统的陈述,也不能对 Matlab 发表陈述,但在这种特定情况下,R 拟合显然更好。但是,我相信如果您提供不错的起始值,您也可以从 Matlab 中得到很好的选择。在任何情况下,如果您正在拟合一个模型,您应该始终进行适当的诊断,并且永远不要盲目地相信一个拟合。
    猜你喜欢
    • 2012-02-01
    • 1970-01-01
    • 2023-03-12
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    相关资源
    最近更新 更多