我正在尝试创建一个执行sign测试的函数。该函数应接受向量x和中位数m,并返回由min(1,2*min(P{N≤i},P{N≥i}))定义的p值,其中N~Bin(n,0.5),n是不等于m的值的数量,i是n中小于m的值的数量。
这是我到目前为止得到的结果:
test<-function(x,m) {
n<-length(x[x!=m])
i<-length(n[n<m])
min(1,c(pbinom(q=i,size=n,p=0.5),1-pbinom(q=i,size=n,p=0.5)))
}然而,当我用给定的值测试它时,它给出了错误的答案:
test(x=1:3, m=2)
[1] 0.25
test(x = 1:5, m = 2)
[1] 0.0625正确答案应该是1和0.625。我不知道我做错了哪一步。
发布于 2021-06-14 18:19:14
您的思路是正确的:除了您犯下的两个小错误(忘记了因子2,计算i时存在问题:请注意,在脚本中,n是一个整数,而不是向量!),在min中计算第三项时还存在一个更微妙但更重要的错误
对于离散值概率分布(如二项式分布),我们有1 - P(N<=i) = P(N<i),它是与不同的P(N<=i)。
您可以通过在最后一项中从i中减去一个极小值eps并使用近似P(N <= i-eps) ≈ P(N < i)来解决此问题
test <- function(x , m){
# amount of entries that are not m
n <- sum(x!=m)
# amoutn of entries that are smaller than m
i <- sum(x<m)
eps = 1e-10
min(1,
2*pbinom(q=i,size=n,p=0.5),
# to get P(N >= i), we need 1 - P(N < I), not 1 - P(N <= i)
2*(1-pbinom(q=i-eps,size=n,p=0.5))
)
}https://stackoverflow.com/questions/67967932
复制相似问题