优化错误par = Tm1,fn = .logLgam,x = x:未找到对象“Tm1”

问题描述

我正在尝试在 R 中运行 MSClaio2008 库的 nsRFA 函数。按照文档,我已经成功运行了网站上给出的示例。但是,当我创建自己的数据集以使用 MSClaio2008 函数运行时,如下所示:

library(nsRFA)
data <- c(91,84,42,30,66,95,65,12,27,61,31,101,48,52,53,55,80,23,87,46,50,33,75,88,54,17,57,39,10,89,59,24,11,43,13,93,105,28,104,18,103,62,22,58,15,34,74,51,97,44,99,76,14,16,109,92,110,40,78,83,60,49,96,36,32,81,68,20,56,25,63,47,37,29,100,71,106,41,90,70,85,38,19,108,73,102,26,82,98,45,77,35,94,79,86,72,107,21,67,69,64)
MSC <- MSClaio2008(data)

它抛出这个错误

优化错误(par = Tm1,fn = .logLgam,x = x):未找到对象“Tm1”

在这个平台上搜索主题,找到了 this 但这并没有解决我的问题。

解决方法

这看起来像是包中的一个错误,但它与您的数据奇怪的事实有关。这个函数应该是拟合水文极端观测的分布:你给它一个从 10 到 110 的整数序列。

事实证明,在计算某些可能分布(P3GEV,我认为)的拟合时,该函数会在内部计算分布的 偏度数据,并测试如果偏度为正 负,该怎么办。它没有考虑偏度恰好为 0 的可能性!

内部nsRFA:::ML_estimation

skx <- sum((x - mean(x))^3)/(length(x) * sd(x)^3)
if (skx > 0) {
    Tm1 <- min(x) - 1
    ...
} else if (skx < 0) {
    Tm1 <- max(x) + 1
    ...
}

如果偏度恰好为零,则变量 Tm1 不会设置,依赖于 Tm1 的下一步中断。

如果您以某种方式扰乱数据以使偏度不完全为零,则这应该有效,例如MSClaio2008(c(8,data))MSClaio2008(data+rnorm(length(data),sd=0.001)) ...

这是一个奇怪的案例,但值得联系维护者 (maintainer("nsRFA")) 让他们知道。