我认为,最大的问题是你需要一个数据模型来处理。这些可能是回归模型,也可能只是您的数据适合分布。从理论上讲,您的数据可能与许多模型/分布一致(例如正态分布、由具有适当总试验次数的二项分布产生的成功比例或 beta 分布)。既然你说这些是假数据只是为了说明问题,并且你有连续的比例,我会简单地认为这些比例来自beta 分布。
在其中,您可以使用betareg 包R对 beta 分布式数据进行建模。您应该阅读小插图 ( pdf ),这对于理解有关 beta 回归的想法以及如何使用该包来执行此操作非常有帮助。请特别注意,它们对 beta 分布的参数化与典型的参数化不同。而不是使用α和β(例如,标准?pbeta等函数中的shape1and参数),它们使用平均比例,shape2μ, 和精度,ϕ,其定义如下:
μ α=α(α+β) =μ×ϕand, thus, and,ϕ=α+β β=ϕ−α
我们可以使用这些方程在两个参数化之间移动,从而在两组函数之间移动。然后我们可以将建模链接betareg到分布和分位数函数。操作转换将基于类比qq-plots如何用于比较两个分布。
首先,让我们对这些数据进行建模betareg并确定组之间的精度是否恒定:
library(betareg)
library(lmtest)
# test of constant precision based on beta distribution:
cp = betareg(x~f, df)
vp = betareg(x~f|f, df)
lrtest(cp, vp)
# Likelihood ratio test
#
# Model 1: x ~ f
# Model 2: x ~ f | f
# #Df LogLik Df Chisq Pr(>Chisq)
# 1 3 9.2136
# 2 4 9.4793 1 0.5314 0.466
对于这些(假)数据,几乎没有理由相信精度会有所不同,但对于您的真实数据,它们可能会有所不同。所以我将演示更复杂的版本,如果你愿意,你可以简化它。无论如何,下一步是确定估计的α( shape1) 和β( shape2) 参数,A并B通过将模型的系数转换为分布参数(不要忘记链接函数!)并使用上述公式在两个参数化之间进行转换:
summary(vp)
# ...
# Coefficients (mean model with logit link):
# Estimate Std. Error z value Pr(>|z|)
# (Intercept) -1.3153 0.2165 -6.074 1.25e-09 ***
# fB 1.4260 0.3178 4.487 7.23e-06 ***
#
# Phi coefficients (precision model with log link):
# Estimate Std. Error z value Pr(>|z|)
# (Intercept) 3.0094 0.5695 5.284 1.26e-07 ***
# fB -0.5848 0.7943 -0.736 0.462
# ...
lo.to.prop = function(x){
o = exp(x)
p = o / (o+1)
return(p)
}
alpha.A = lo.to.prop(coef(vp)[1] ) * exp(coef(vp)[3] )
alpha.B = lo.to.prop(coef(vp)[2]+coef(vp)[1]) * exp(coef(vp)[4]+coef(vp)[3])
beta.A = exp( coef(vp)[3] ) - alpha.A
beta.B = exp( coef(vp)[4]+coef(vp)[3]) - alpha.B
由于这很复杂,我们可能会对最终值进行常识检查。(如果您不需要对它们进行建模和/或不需要测试精度是否相同,这也建议使用另一种更简单的方法来获取这些参数。)
cbind(c(alpha.A, beta.A), c(alpha.B, beta.B))
# [,1] [,2]
# (Intercept) 4.290073 5.960932
# (phi)_(Intercept) 15.984533 5.336616
# parameterization for beta distribution:
library(fitdistrplus)
fitdist(with(df, x[f=="A"]), "beta")
# Fitting of the distribution ' beta ' by maximum likelihood
# Parameters:
# estimate Std. Error
# shape1 4.290883 2.389871
# shape2 15.987505 9.295580
fitdist(with(df, x[f=="B"]), "beta")
# Fitting of the distribution ' beta ' by maximum likelihood
# Parameters:
# estimate Std. Error
# shape1 5.960404 3.379447
# shape2 5.335963 3.010541
现在,我们将原始比例转换B为它们相应的 beta 概率(即,它们在自己的 beta 分布中的位置),并将这些概率转换为A的 beta 分布的分位数:
p.B = pbeta(df$x[df$f=="B"], shape1=alpha.B, shape2=beta.B)
q.B.as.A = qbeta(p.B, shape1=alpha.A, shape2=beta.A)
最后一步,让我们看一下新值:
cbind(df$x[df$f=="B"], q.B.as.A)
# q.B.as.A
# [1,] 0.50 0.18502881
# [2,] 0.30 0.08784683
# [3,] 0.45 0.15784496
# [4,] 0.60 0.24648412
# [5,] 0.54 0.20838604
# [6,] 0.77 0.38246863
