Mat*_*ews 9 statistics r distribution model-fitting weibull
我一直在R做一些数据分析,我试图找出如何使我的数据适合3参数Weibull分布.我找到了如何使用2参数Weibull来完成它,但是在找到如何使用3参数进行操作方面做得不够.
以下是我使用包中的fitdistr函数来拟合数据的方法MASS:
y <- fitdistr(x[[6]], 'weibull')
Run Code Online (Sandbox Code Playgroud)
x[[6]] 是我的数据的子集,y是我存储拟合结果的地方.
首先,您可能想要查看FAdist包.但是,这并不难rweibull3做到rweibull:
> rweibull3
function (n, shape, scale = 1, thres = 0)
thres + rweibull(n, shape, scale)
<environment: namespace:FAdist>
Run Code Online (Sandbox Code Playgroud)
和同样来自dweibull3于dweibull
> dweibull3
function (x, shape, scale = 1, thres = 0, log = FALSE)
dweibull(x - thres, shape, scale, log)
<environment: namespace:FAdist>
Run Code Online (Sandbox Code Playgroud)
所以我们有这个
> x <- rweibull3(200, shape = 3, scale = 1, thres = 100)
> fitdistr(x, function(x, shape, scale, thres)
dweibull(x-thres, shape, scale), list(shape = 0.1, scale = 1, thres = 0))
shape scale thres
2.42498383 0.85074556 100.12372297
( 0.26380861) ( 0.07235804) ( 0.06020083)
Run Code Online (Sandbox Code Playgroud)
编辑:如评论中所述,在尝试以这种方式拟合分布时会出现各种警告
Error in optim(x = c(60.7075705026659, 60.6300379017397, 60.7669410153573, :
non-finite finite-difference value [3]
There were 20 warnings (use warnings() to see them)
Error in optim(x = c(60.7075705026659, 60.6300379017397, 60.7669410153573, :
L-BFGS-B needs finite values of 'fn'
In dweibull(x, shape, scale, log) : NaNs produced
Run Code Online (Sandbox Code Playgroud)
对我来说起初它只是NaNs produced,而且这不是我第一次看到它所以我认为它没有那么有意义,因为估计是好的.经过一番搜索,这似乎是一个非常受欢迎的问题,我既找不到原因也找不到解决方案.一种替代方案可能是使用stats4包和mle()功能,但它似乎也有一些问题.但是我可以让你使用danielmedic 修改过的代码版本,我已经检查了几次:
thres <- 60
x <- rweibull(200, 3, 1) + thres
EPS = sqrt(.Machine$double.eps) # "epsilon" for very small numbers
llik.weibull <- function(shape, scale, thres, x)
{
sum(dweibull(x - thres, shape, scale, log=T))
}
thetahat.weibull <- function(x)
{
if(any(x <= 0)) stop("x values must be positive")
toptim <- function(theta) -llik.weibull(theta[1], theta[2], theta[3], x)
mu = mean(log(x))
sigma2 = var(log(x))
shape.guess = 1.2 / sqrt(sigma2)
scale.guess = exp(mu + (0.572 / shape.guess))
thres.guess = 1
res = nlminb(c(shape.guess, scale.guess, thres.guess), toptim, lower=EPS)
c(shape=res$par[1], scale=res$par[2], thres=res$par[3])
}
thetahat.weibull(x)
shape scale thres
3.325556 1.021171 59.975470
Run Code Online (Sandbox Code Playgroud)