【问题标题】:Calculate probability from density function从密度函数计算概率
【发布时间】:2017-09-20 02:06:02
【问题描述】:

我已经构建了密度函数,现在我想计算一个新数据点“落入”选定区间(例如,a=3,b=7)的概率。所以,我正在寻找:

P(a<x<=b)

一些样本数据:

df<- data.frame(x=c(sample(6:9, 50, replace=TRUE), sample(18:23, 25, replace=TRUE)))

dens<- density(df$x)

我很乐意听到任何解决方案,但最好是在 base r

提前谢谢你

【问题讨论】:

    标签: r probability-density


    【解决方案1】:

    您需要将密度作为函数(使用approxfun),然后将该函数积分到所需的限制范围内。

    integrate(approxfun(dens), lower=3, upper=7)
    0.258064 with absolute error < 3.7e-05
    
    ## Consistency check
    integrate(approxfun(dens), lower=0, upper=30)
    0.9996092 with absolute error < 1.8e-05
    

    【讨论】:

    • 非常感谢。还有一个问题:我试图将我的density 限制为dens&lt;-density(df$x, from=0, to=24)。但是当我计算integrate(approxfun(dens), lower=0, upper=24) 时,我没有得到预期的“完整”概率(1)。有没有办法限制我的密度函数,以便我得到我期望得到的?
    • 标准带宽可能对您来说太大了。试试dens &lt;- density(df$x, from=0, to=24, adjust=0.5)
    【解决方案2】:

    这是一个 R 问题,但这也可以在 Java 中使用黎曼近似来完成 你需要定义一个黎曼接口

    public interface Riemann extends
    BiFunction<Function<Double,Double>,Integer,BinaryOperator<Double>>{}
    

    那你就可以用lambda演算来实现接口了

    int N=100000;
    Riemann s = (f, n) -> (a, b) -> 
    IntStream.range(0, n).mapToDouble(i->f.apply(a + i*((b-a)/n))*((b-a)/n)).sum();
    

    作为示例,我们将使用形状参数 k=1.5 计算 Weibull 随机变量在 1/4 和 3/4 之间的概率

    double k=1.5;
    Optional<Double>weib=
        Optional.of(s.apply(x->k*pow(x,k-1)*exp(-pow(x,k)), N).apply(0.25,0.75));
    weib.ifPresent(System.out::println);
    

    结果应该是 0.36 或 36%。使用您自己的集成库而不是包库的优势在于它有助于了解后台发生的情况。

    【讨论】:

      猜你喜欢
      • 2012-11-21
      • 2020-04-22
      • 2019-07-19
      • 2019-12-14
      • 1970-01-01
      • 2020-12-06
      • 1970-01-01
      • 1970-01-01
      • 2018-12-11
      相关资源
      最近更新 更多