c# – 使用MathNET的置信区间

c# – 使用MathNET的置信区间,第1张

概述我有一个IEnumerable< double>数据样本.我想计算信号/数据的90%置信区间.我有 MathNET library可供我使用,但我对如何正确使用库感到困惑.根据我的数据,我们的想法是返回两个包含原始信号置信区间的附加数据数组 using MathNet.Numerics.Statistics;using MathNet.Numerics.Distributions;publi 我有一个IEnumerable< double>数据样本.我想计算信号/数据的90%置信区间.我有 MathNET library可供我使用,但我对如何正确使用库感到困惑.根据我的数据,我们的想法是返回两个包含原始信号置信区间的附加数据数组

using MathNet.Numerics.Statistics;using MathNet.Numerics.distributions;public static List<double[]> ConfIDenceIntervals(IEnumerable<double> sample,double interval){    Contract.Requires(interval > 0 && interval < 1.0);    int sampleSize = sample.Count();    double Alpha = 1.0 - interval;    double mean = sample.Mean();    double sd = sample.StandardDeviation();    double t,mu;    double[] upper = new double[sampleSize];    double[] lower = new double[sampleSize];    StudentT studentT = new StudentT(mean,Alpha,sampleSize - 1);    int index = 0;    foreach (double d in sample)    {        t = studentT.Cumulativedistribution(d);        double tmp = t * (sd / Math.Sqrt(sampleSize));        mu = mean - tmp;        upper[index] = d + mu;        lower[index] = d - mu;    }    return new List<double[]>() { upper,lower };}

这在数学方面确实不复杂,我对如何正确使用MathNET library中可用的函数/方法感到困惑.

解决方法 我不完全确定我理解信号的置信区间应该如何应用于信号的每个样本,但是我们可以如下计算样本集的置信区间:

public static Tuple<double,double> A(double[] samples,double interval){    double theta = (interval + 1.0)/2;    double mean = samples.Mean();    double sd = samples.StandardDeviation();    double T = StudentT.InvCDF(0,1,samples.Length-1,theta);    double t = T * (sd / Math.Sqrt(samples.Length));    return Tuple.Create(mean-t,mean+t);}

除了我们计算T的行不能编译,因为遗憾的是当前Math.NET Numerics中还没有StudentT.InvCDF.但在此期间,我们仍然可以将其作为一种解决方法进行数值评估:

var student = new StudentT(0,samples.Length-1);double T = FindRoots.OfFunction(x => student.Cumulativedistribution(x)-theta,-800,800);

例如,对于16个样本和Alpha 0.05,我们按预期得到2.131.如果有超过60-100个样本,这也可以用正态分布近似:

double T = Nomal.InvCDF(0,theta);

总而言之:

public static Tuple<double,double> B(double[] samples,double interval){    double theta = (interval + 1.0)/2;    double T = FindRoots.OfFunction(x => StudentT.CDF(0,x)-theta,800);    double mean = samples.Mean();    double sd = samples.StandardDeviation();    double t = T * (sd / Math.Sqrt(samples.Length));    return Tuple.Create(mean-t,mean+t);}

这还不是完整的答案,因为我理解你想以某种方式将置信区间应用于每个样本,但希望它有助于实现目标.

PS:使用Math.NET Numerics v3.0.0-Alpha7

总结

以上是内存溢出为你收集整理的c# – 使用MathNET的置信区间全部内容,希望文章能够帮你解决c# – 使用MathNET的置信区间所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1218713.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存