- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用 rplcon()
生成一些随机变量包中的函数 poweRlaw
data <- rplcon(1000,10,2)
现在,我想知道哪些已知分布最适合数据。对数范数?经验值? Gamma ?幂律?具有指数截断的幂律?
所以我使用函数 fitdist()
在包装内 fitdistrplus
:
fit.lnormdl <- fitdist(data,"lnorm")
fit.gammadl <- fitdist(data, "gamma", lower = c(0, 0))
fit.expdl <- fitdist(data,"exp")
根据CRAN Task View: Probability Distributions,幂律分布和指数截断幂律不是基本概率函数, 所以我根据?fitdist
的例子4写了幂律的d,p,q函数
dplcon <- function (x, xmin, alpha, log = FALSE)
{
if (log) {
pdf = log(alpha - 1) - log(xmin) - alpha * (log(x/xmin))
pdf[x < xmin] = -Inf
}
else {
pdf = (alpha - 1)/xmin * (x/xmin)^(-alpha)
pdf[x < xmin] = 0
}
pdf
}
pplcon <- function (q, xmin, alpha, lower.tail = TRUE)
{
cdf = 1 - (q/xmin)^(-alpha + 1)
if (!lower.tail)
cdf = 1 - cdf
cdf[q < round(xmin)] = 0
cdf
}
qplcon <- function(p,xmin,alpha) alpha*p^(1/(1-xmin))
最后,我使用下面的代码获取参数 xmin
和 alpha
幂律:
fitpl <- fitdist(data,"plcon",start = list(xmin=1,alpha=1))
但是它抛出一个错误:
<simpleError in optim(par = vstart, fn = fnobj, fix.arg = fix.arg, obs = data, ddistnam = ddistname, hessian = TRUE, method = meth, lower = lower, upper = upper, ...): function cannot be evaluated at initial parameters>
Error in fitdist(data, "plcon", start = list(xmin = 1, alpha = 1)) :
the function mle failed to estimate the parameters,
with the error code 100
我尝试在google和stackoverflow中搜索,出现了很多类似的错误问题,但是阅读和尝试后,我的问题都没有解决方案,我应该怎么做才能正确完成以获取参数?感谢所有帮助过我的人!
最佳答案
这是一个有趣的发现,我对这一发现并不完全满意,但我会告诉你我的发现,看看它是否有帮助。
在调用 fitdist
时函数,默认情况下它要使用 mledist
来自同一个包。这本身会导致调用 stats::optim
这是一个通用的优化函数。在它的返回值中,它给出了收敛错误代码,请参见 ?optim
了解详情。 100
你看到的不是optim
返回的那些之一.所以我拆开了 mledist
的代码和 fitdist
找到错误代码的来源。不幸的是,它在不止一种情况下被定义,并且是一个一般的陷阱错误代码。如果你分解所有的代码,什么fitdist
在这里尝试做的是以下内容,事先进行各种检查等。
fnobj <- function(par, fix.arg, obs, ddistnam) {
-sum(do.call(ddistnam, c(list(obs), as.list(par),
as.list(fix.arg), log = TRUE)))
}
vstart = list(xmin=5,alpha=5)
fnobj <- function(par, fix.arg obs, ddistnam) {
-sum(do.call(ddistnam, c(list(obs), as.list(par),
as.list(fix.arg), log = TRUE)))
}
ddistname=dplcon
fix.arg = NULL
meth = "Nelder-Mead"
lower = -Inf
upper = Inf
optim(par = vstart, fn = fnobj,
fix.arg = fix.arg, obs = data, ddistnam = ddistname,
hessian = TRUE, method = meth, lower = lower,
upper = upper)
如果我们运行这段代码,我们会发现一个更有用的错误“无法在初始参数处评估函数”。如果我们查看函数定义,这是有道理的。有xmin=0
或 alpha=1
将产生 -Inf
的对数似然.好的,考虑尝试不同的初始值,我尝试了一些随机选择,但都返回了一个新错误,“非有限有限差分值 1”。
正在搜索 optim
进一步了解这两个错误的来源,它们不是 R 源本身的一部分,但是有一个 .External2
打电话,所以我只能假设错误来自那里。非有限错误意味着某处的函数评估之一给出了非数字结果。函数 dplcon
将在alpha <= 1
时这样做或 xmin <= 0
. fitdist
允许您指定传递给 mledist
的其他参数或其他(取决于您选择的方法,mle 是默认的)lower
是一种用于控制要优化的参数的下限。所以我尝试施加这些限制并再次尝试:
fitpl <- fitdist(data,"plcon",start = list(xmin=1,alpha=2), lower = c(xmin = 0, alpha = 1))
恼人的是,这仍然会给出错误代码 100。跟踪此错误会产生错误“L-BFGS-B 需要‘fn’的有限值”。当您指定边界时,优化方法已从默认的 Nelder-Mead 更改,并且在外部 C 代码调用的某处出现此错误,大概接近 xmin
的限制。或 alpha
当我们接近无穷大时,数值计算的稳定性很重要。
我决定进行分位数匹配而不是最大似然匹配以尝试找出更多信息
fitpl <- fitdist(data,"plcon",start = list(xmin=1,alpha=2),
method= "qme",probs = c(1/3,2/3))
fitpl
## Fitting of the distribution ' plcon ' by matching quantiles
## Parameters:
## estimate
## xmin 0.02135157
## alpha 46.65914353
这表明 xmin
的最佳值接近于 0,这是极限。我不满意的原因是我无法使用 fitdist
获得分布的最大似然拟合。但是希望这种解释有所帮助,并且分位数匹配提供了另一种选择。
编辑:
在了解了更多关于幂律分布的一般知识后,您会发现这并不像您预期的那样有效。参数 power 参数有一个似然函数,它可以在给定的 xmin 条件下最大化。然而,xmin 不存在这样的表达式,因为似然函数在 xmin 中增加。通常 xmin 的估计来自 Kolmogorov--Smirnov 统计量,参见 this mathoverflow 问题和 poweRlaw 包的 d_jss_paper 小插图以获取更多信息和相关引用。
poweRlaw
中有估计幂律分布参数的功能包装自己。
m = conpl$new(data)
xminhat = estimate_xmin(m)$xmin
m$setXmin(xminhat)
alphahat = estimate_pars(m)$pars
c(xmin = xminhat, alpha = alphahat)
关于r - 包 `fitdistr()`中的 `fitdistrplus`函数拟合的幂律,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37152482/
我有一个一维数据列表,我想使用最小二乘法或最大似然法将其拟合到一个分布中,如图所示 here ,但我想从 python 而不是 R 交互式 shell 来完成。 我得到了 rpy2安装,并希望在交互式
我的问题在最后以粗体显示。 我知道如何使 beta 分布适合某些数据。例如: library(Lahman) library(dplyr) # clean up the data and calcul
我使用 rplcon() 生成一些随机变量包中的函数 poweRlaw data Error in fitdist(data, "plcon", start = list(xmin = 1, alp
我希望找到使用 R 的 fitdistr 函数 (MLE) 截断的分布的威 bool 形状和尺度参数。使用树木直径数据样本(最小为 2.8): data1,因为 fitdistr 没有考虑数据被截断的
我需要将数据拟合到 Beta 分布并检索 alpha 参数。我正在尝试使用 python (rpy2) 中的 R,我的代码如下所示: from rpy2 import * from rpy2.robj
我想定义我自己的分布函数以与 R 中的 fitdist 或 fitdistr 函数一起使用。 以 fitdistrplus 包中的 fitdist 为例。我定义了一个名为 sgamma 的自定义分布,
我在 R 中遇到 fitdistr{MASS} 函数的问题。我有这个向量: a <- c(26,73,84,115,123,132,159,207,240,241,254,268,272,282,30
我想定义自己的分布,与 fitdistrplus 函数一起使用,以适应从现在起称为“月”的每月降水数据。我正在使用“lmomco”函数来帮助我定义发行版,但无法使其工作。例如,我定义广义极值 (gev
我看到以下警告。有没有人知道为什么会出现这样的警告,尽管看起来合身似乎可以正常工作?有什么方法可以使优化工作更好,使其不会产生这些警告? R> library(MASS) R> set.seed(0)
我是一名优秀的程序员,十分优秀!