首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建一个在R中返回p值min(1,2*min(P{N≤i},P{N≥i}))的函数?

如何创建一个在R中返回p值min(1,2*min(P{N≤i},P{N≥i}))的函数?
EN

Stack Overflow用户
提问于 2021-06-14 17:36:25
回答 1查看 37关注 0票数 1

我正在尝试创建一个执行sign测试的函数。该函数应接受向量x和中位数m,并返回由min(1,2*min(P{N≤i},P{N≥i}))定义的p值,其中N~Bin(n,0.5),n是不等于m的值的数量,i是n中小于m的值的数量。

这是我到目前为止得到的结果:

代码语言:javascript
复制
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)))
}

然而,当我用给定的值测试它时,它给出了错误的答案:

代码语言:javascript
复制
test(x=1:3, m=2)
[1] 0.25

test(x = 1:5, m = 2) 
[1] 0.0625

正确答案应该是1和0.625。我不知道我做错了哪一步。

EN

回答 1

Stack Overflow用户

发布于 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)来解决此问题

代码语言:javascript
复制
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))
  )
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67967932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档