从密度函数计算概率

Calculate probability from density function

我已经构建了密度函数,现在我想计算新数据点 "fall" 进入选定区间(例如,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

提前致谢

您需要将密度作为函数获取(使用 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

这是一道 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

计算威布尔随机变量在 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%。使用自己的集成库而不是包库的好处是它有助于了解后台发生的事情。