使用累积 beta 分布查找我的数据的估计值

机器算法验证 r 分布 曲线拟合 贝塔分布
2022-04-15 18:39:56

我试图找到更适合黑色曲线(经验)的 beta 分布(红色曲线)的alphabeta

试图找到参数使红色曲线更好地拟合黑色曲线

我有一个函数可以找到我的数据的“非参数”逆累积函数(boot.mean)。我想找到一个适合的发行版。到目前为止,我认为可以以某种方式使用累积 beta 分布( alpha = beta = 2 )。不过,我希望看到一个更符合要求的发行版...

# raw data produced by a function (inverse cumulative distribution)
boot.mean <- c(37.021, 35.051, 29.091, 27.094, 22.058, 18.994, 16.944, 12.897, 7.903, 4.926, 3.939, 1.94, 1.94, 0.968)

#"fidge" (not sensu Climategate) boot.mean for comparison to qbeta
scaled <- 1 - (boot.mean/boot.mean[1])
scaled[1] <- 0.01 #dreader zero be gone
range(scaled)
 [1] 0.0100000 0.9738527

# this is the theoretical curve
x <- seq(0, 1, length = 100)
y <- qbeta(x, shape1 = 2, shape2 = 2)

# all along the x axis
x.axis <- seq(from = 0, to = 1, length = length(scaled))

# plot empirical and the theoretical values
plot(x.axis, scaled, type = "l")
lines(y, x, col = "red")

# I'm just an x-con trying to fit a distribution to my data
(beta.fitted <- MASS::fitdistr(x = scaled, densfun = qbeta, start = list(shape1 = 2, shape2 = 2)))
 Error in optim(x = c(0.01, 0.0532130412468599, 0.214202749790659, 0.268145106831258,  : 
   non-finite finite-difference value [2]
 In addition: There were 50 or more warnings (use warnings() to see the first 50)
2个回答

以这种特别的方式重新调整数据不是一个好主意,因为它可能会导致拟合效果不佳(并破坏估计比例参数的抽样方差的任何机会):只需将缩放的 Beta 分布拟合到数据本身即可

您必须为数据分配百分比;下面我使用作为最小的值,排序为将重新缩放的 CDF 拟合到经验分布理想情况下,拟合会考虑值的相关性和异方差性,但在这种情况下,非线性最小二乘法确实可以:p(i)=(i1/2)/nithnx1x2xn{(xi,pi)}

数据和拟合 CDF

这种特殊的拟合是,其中是 Beta( ) 分布的 CDF,其中这是一个 U 形分布(,它在两个尾部都有模式)。(相关性和异方差性表明参数的最小二乘置信区间是不可信的;改为引导它们。我没有进行计算,因此只会报告不可信的标准错误:对于对于\F(x/γ)Fα,βα=0.59β=0.87γ=39.20.06α0.15β2.4γ。)

考虑在此之后进行拟合优度测试。 即使是一个简单的测试也会给出一些关于不适合的有用提示。对于这些数据,图表表明这种拟合效果很好,无论如何。残差与拟合图表明拟合在数据的高端稍好一些,但在残差较小的情况下看起来足够随机:χ2

残差与拟合图

这与数据有一点测量误差的模型是一致的:与其他地方(中值到高值)相比,CDF 陡峭的地方(低值)会更破坏拟合。

第一句话:您的数据远不及分布,绝对不是 beta 函数。如我所见,您将 boot.mean 视为“密度”,将 x 轴(索引?)视为值。beta 函数限制在 0 和 1 之间,并且由于任何密度函数曲线下的面积都应等于 1,因此您的数据不会接近。@whuber 的优点:适合缩放版本。或者:如@iterator 所说,缩放到数据的总和。现在,由于 beta 函数需要缩放两次(在 X 轴上,所以索引和 Y 轴上,都是实际数据)

现在你谈到了 beta 函数,你在其他地方谈到了累积正态分布的倒数。我想您的意思是“当该发行版照镜子时,它会看到我想看到的……” ;-)

因此,下面给出了一种特殊的方法(没有任何理论背景,因为该背景不是您在这里需要的)。除了其他人在这里所说的之外,我只想指出该optim()功能,它基本上可以满足您的需求。无论您是否适合缩放和镜像的 beta 分布,或者对于某个接近值的看起来接近逆正态累积分布的东西...

customFit <- function(x, data) {
    d.data <- rev(cumsum(dnorm(1:length(data), x[1], x[2]))) * max(data)
    SS <- sum((d.data - data)^2)
    return(SS)
}

fit.optim <- optim(c(5, 8), customFit, data = boot.mean)

plot(boot.mean)
lines(rev(cumsum(dnorm(1:length(boot.mean), 
         fit.optim$par[1], fit.optim$par[2]))) * max(boot.mean), 
         col = "red")

警告说明:除了定义适合您的数据的函数外,您对此结果无能为力...