写ρ对于优势比,β=公关( E),γ=公关( O ). 四个独立方程是
⎧⎩⎨⎪⎪⎪⎪a + b = βa + c = γa + b + c + d= 1一个_= ρ b c 。
添加前两个节目
b + c = β+ γ− 2个。(1)
将前两个方程相乘并使用 (一)产量
b c = βγ- ( β+ γ)一个+一个2.(2)
将第三个方程乘以一个, 用第四个重新表达一个_并插入(1)和(2)给
a2+a(β+γ−2a)+ρ(βγ−(β+γ)a+a2)=a.
在更标准的形式中,这是二次方的零
(ρ−1)a2+[(β+γ)(1−ρ)−1]a+ρβγ.(3)
假如β,γ,ρ与一些一致2×2表中,至少会有一个实零(3),使用任何二次公式很容易找到。对于任何一个零,其余条目的解很容易从原始方程的前三个中找到:
{b=β−ac=γ−ad=1+a−β−γ.
至多会有一个有效的解决方案a,由系数的非负性决定。这是R
解决方案作为函数的实现f
以及使用随机生成的表的测试。测试输出随机表、它的重构值f
,以及它们之间差异的度量。通过将测试包装在 中replicate
,我已经运行了 10,000 次。最终输出给出了发现的最大差异:直到浮点误差为零,证明了这种方法的正确性。
f <- function(beta, gamma, rho, eps=1e-15) {
a <- rho-1
b <- (beta+gamma)*(1-rho)-1
c_ <- rho*beta*gamma
if (abs(a) < eps) {
z <- -c_ / b
} else {
d <- b^2 - 4*a*c_
if (d < eps*eps) s <- 0 else s <- c(-1,1)
z <- (-b + s*sqrt(max(0, d))) / (2*a)
}
y <- vapply(z, function(a) zapsmall(matrix(c(a, gamma-a, beta-a, 1+a-beta-gamma), 2, 2)),
matrix(0.0, 2, 2))
i <- apply(y, 3, function(u) all(u >= 0))
return(y[,,i])
}
set.seed(17)
i<-0
sim <- replicate(1e4, {
while(TRUE) {
x <- matrix(round(rexp(4), 2), 2, 2)
if(all(rowSums(x) > 0) && all(colSums(x) > 0) && x[1,2]*x[2,1] > 0) break
}
x <- x / sum(x)
beta <- rowSums(x)[1]
gamma <- colSums(x)[1]
rho <- x[1,1]*x[2,2] / (x[1,2]*x[2,1])
y<- f(beta, gamma, rho)
delta <- try(zapsmall(c(1, sqrt(crossprod(as.vector(x-y)))))[2])
if ("try-error" %in% class(delta)) cat("Error processing ", x, "\n")
delta
})
max(sim)