牢记@G.Grothendieck 建议的注意事项:对独立X 和 Y 变量的乘积和商有用的助记符是
CV^2(X/Y) = CV^2(X*Y) = CV^2(X) + CV^2(Y)
其中CV
是变异系数 ( sd(X)/mean(X)
),所以CV^2
是Var/mean^2
。换句话说
Var(Y/X)/(m(Y/X))^2 = Var(X)/m(X)^2 + Var(Y)/m(Y)^2
或重新排列
sd(Y/X) = sqrt[ Var(X)*m(Y/X)^2/m(X)^2 + Var(Y)*m(Y/X)^2/m(Y)^2 ]
对于均值远离零的随机变量,这是一个合理的近似值。
set.seed(101)
y <- rnorm(1000,mean=5)
x <- rnorm(1000,mean=10)
myx <- mean(y/x)
sqrt(var(x)*myx^2/mean(x)^2 + var(y)*myx^2/mean(y)^2) ## 0.110412
sd(y/x) ## 0.1122373
使用您的示例要差得多,因为 Y 的 CV 接近 1 - 我最初认为它看起来不错,但现在我发现它有偏差并且没有很好地捕捉可变性(我还插入了预期值平均值和 SD 而不是它们的模拟值,但对于如此大的样本,应该是误差的一小部分。)
me.x <- 4; sd.x <- 1
me.y <- 5; sd.y <- 4
myx <- me.y/me.x - 0/me.x^2 + sd.x*me.y/me.x^3
x <- rnorm(1e4,me.x,sd.x); y <- rnorm(1e4,me.y,sd.y)
c(myx,mean(y/x))
sdyx <- sqrt(sd.x^2*myx^2/me.x^2 + sd.y^2*myx^2/me.y^2)
c(sdyx,sd(y/x))
## 1.113172 1.197855
rvals <- replicate(1000,
sd(rnorm(1e4,me.y,sd.y)/rnorm(1e4,me.x,sd.x)))
hist(log(rvals),col="gray",breaks=100)
abline(v=log(sdyx),col="red",lwd=2)
min(rvals) ## 1.182698

所有用于计算 Y/X 方差的固定 delta 方法都使用 Y/X 的点估计(即 m(Y/X) = mY/mX),而不是您上面使用的二阶近似值。为均值和方差构建高阶形式应该很简单,如果可能很乏味(计算机代数系统可能会有所帮助......)
mvec <- c(x = me.x, y = me.y)
V <- diag(c(sd.x, sd.y)^2)
car::deltaMethod(mvec, "y/x", V)
## Estimate SE
## y/x 1.25 1.047691
library(emdbook)
sqrt(deltavar(y/x,meanval=mvec,Sigma=V)) ## 1.047691
sqrt(sd.x^2*(me.y/me.x)^2/me.x^2 + sd.y^2*(me.y/me.x)^2/me.y^2) ## 1.047691
对于它的价值,我把@SeverinPappadeux 的答案中的代码做成了一个函数gratio(mx,my,sx,sy)
。对于 Cauchygratio(0,0,1,1)
案例NA
(对于由 OP ( gratio(5,4,4,1)
) 指定的参数,它给出了 mean=1.352176, sd=NA 如上所述。对于我在上面尝试的第一个参数 ( gratio(10,5,1,1)
),它给出了 mean=0.5051581,sd=0.1141726。
这些数值实验强烈地向我表明,高斯的比率有时具有明确定义的方差,但我不知道何时(关于 Math StackOverflow 或 CrossValidated 的另一个问题的时间?)