我已经建立了密度函数,现在我想计算新数据点落到"下降的概率。进入选定的区间(例如,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
提前谢谢
答案 0 :(得分:7)
您需要将密度作为一个函数(使用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
答案 1 :(得分:0)
这是一个R问题,但这也可以使用Riemann近似在Java中完成 您需要定义一个Riemann接口
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%。使用您自己的积分库而不是程序包库的优点是,它有助于了解后台发生了什么。