【问题标题】:Calculating a proportion for a sequence of normal random variables计算一系列正态随机变量的比例
【发布时间】:2014-09-26 20:06:09
【问题描述】:

我想检查一个标准正态分布序列是否有 95% 的值在 -2 和 2 之间。

要检查这个,比如说,50 个标准正态分布,我使用 x=rnorm(50,0,1),然后,为了获得比例,我使用 length(x[x<abs(2)])/length(x)

我想将此任务重复一定次数(例如 25000 次)以查看我得到的不同结果。因此,我使用replicate(2500, rnorm(50,0,1)),但现在我需要一个不同的比例代码。我想到了类似lapply() 的东西,前面提到的对象replicate() 作为第一个参数,作为第二个参数,获取比例的函数,但它不起作用。我怎样才能以正确的方式做到这一点?

【问题讨论】:

    标签: r statistics probability


    【解决方案1】:

    您可以replicate() 一段代码和一条语句。怎么样

    replicate(2500, {x<-rnorm(50,0,1); length(x[x<abs(2)])/length(x)})
    

    虽然我可能会这样写

    replicate(2500, {x<-rnorm(50,0,1); mean(abs(x)<2)})
    

    此外,replicate()+*apply 组合也应该可以工作

    sapply(replicate(2500, rnorm(50,0,1), simplify=FALSE), 
        function(x) mean(abs(x)<2))
    

    【讨论】:

    • 太棒了。我不知道将replicate() 中的大括号用于代码块。谢谢。
    【解决方案2】:

    这可能有效

    # You already have done this:
    x <- rnorm(50, 0, 1)
    length(x[abs(x) < 2]) / length(x)
    ##  [1] 0.96
    
    # Now you can do something like this:
    y <- replicate(25, rnorm(50,0,1)) # Doing it with 25 "replicas" for demonstration purposes
    colSums(ifelse(abs(y) < 2,1,0)) / nrow(y)
    ##  [1] 0.98 0.98 0.94 0.90 0.94 0.98 0.94
    ##  [8] 0.96 0.96 0.94 0.98 0.96 0.96 0.92
    ## [15] 0.94 0.98 0.92 0.98 0.96 0.96 0.94
    ## [22] 0.92 0.94 0.96 0.98
    

    其他方式,由aosmith in his comment提出。

    mean(abs(x) < 2)
    ##  [1] 0.96
    colMeans(abs(y) < 2)
    ##  [1] 0.98 0.98 0.94 0.90 0.94 0.98 0.94
    ##  [8] 0.96 0.96 0.94 0.98 0.96 0.96 0.92
    ## [15] 0.94 0.98 0.92 0.98 0.96 0.96 0.94
    ## [22] 0.92 0.94 0.96 0.98
    

    【讨论】:

    • 如果你改用mean(abs(x) &lt;2)而不是length,那么你可以很容易地使用colMeans
    • @aosmith 确实!包括现在! (每天都在学习一些东西!我喜欢 StackOverflow!)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    • 2015-04-26
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    相关资源
    最近更新 更多