在C#中计算中位数绝对偏差

4
我需要对一组数字进行多个统计计算,其中一个计算需要用到中位数绝对偏差。我收到了一份ISO标准,但它只告诉我:enter image description here由于我没有接受过任何统计学方面的培训,所以不知道该怎么做,也无法将上述内容翻译成C#函数。

我应该补充一下,虽然Math.Net库非常有用,但它不包括MAD函数。 - Captain Kenpachi
med(x)是什么?中位数吗? - WhileTrueSleep
数学中没有这个。你需要创建自己的方法来解决这个问题。你需要有一个清晰的算法。从那时起,一切都会变得轻松。 - Nikhil Agrawal
med(x) 是否可以是所有 x 的中位数?(即第50个百分位数。) - Richard
3个回答

7

中位数是一个排序后数组的中间元素(如果数组有偶数个元素,则为两个中间项的平均值):

  double[] source = new double[] { 1, 2, 3, 4, 5 };

  Array.Sort(source);

  double med = source.Length % 2 == 0
    ? (source[source.Length / 2 - 1] + source[source.Length / 2]) / 2.0
    : source[source.Length / 2];

  double[] d = source
    .Select(x => Math.Abs(x - med))
    .OrderBy(x => x)
    .ToArray();

  double MADe = 1.483 * (d.Length % 2 == 0
    ? (d[d.Length / 2 - 1] + d[d.Length / 2]) / 2.0
    : d[d.Length / 2]);

5
我会信任你,因为我喜欢你的胡须。谢谢。 - Captain Kenpachi
1
@Captain Kenpachi:与其信任,我宁愿运行一些测试 ;) - Dmitry Bychenko
1
当然。我有一组可以进行比较的结果。 - Captain Kenpachi

0
简单步骤如下:
1. 找到数组x[]的中位数med(您可以对数组进行排序并获取中间值,但还有更有效的方法)
2. 使用中位数构建绝对差数组d[]
3. 找到d[]数组的中位数
4. 计算MADe

0

如何编写一个函数来计算中位数,您可以在这里找到。

然后您的函数可能会像这样:

var arrOfValues = new int[] { 1, 3, 5, 7, 9 };

var di = new List<int>();  //List where all di will be stored
var median = calcMedian();  //See the link how to write it
foreach(var elem in arrOfValues)
{
   di.Add(Math.Abs(elem - median));
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接