R中的apply函数无法正确计算中位数

时间:2018-06-26 13:10:20

标签: r apply median

我有SNP的遗传数据,该数据已分为5个分位数。我想找到每个SNP(即每个人)的这些位数的中位数。

我使用此命令为中值创建一列:

data$median<-apply(data[,2:181],1, median, na.rm=TRUE)

然后,我想计算每种表型有多少个病例和对照,但看起来它计算的中位数不正确。我的命令如下:

table(data$anyMI, data$median)

输出显示:

        1   1.5     2   2.5     3   3.5     4   4.5     5
  0  2044    62  7470   221 11163   248  8389    74  1659
  1   102     3   357    11   557    21   404     2    85

我不确定为什么我会得到一半的值,而该值只能是1-5的整数。 这里出了什么问题,为什么显示半值?

2 个答案:

答案 0 :(得分:1)

通过定义,中位数是一个值,例如样本的一半较高,而另一半较低。 如phiver所说,如果您有偶数个值,那么假设您上半部分的上限为x,下半部分的下限为y任何< / strong> xy之间的值可以是中位数。

在默认情况下,R会在这种情况下声明median = (x+y)/2

如果要从数据集中获取一个值,则可以使用奇数个观测值(例如,删除一个观测值)或对结果取整。

答案 1 :(得分:1)

根据标准定义,中位数

    奇数个
  1. 是中间值

    median(1:5)
    #[1] 3
    
  2. 个偶数
  3. 是两个中间两个数的(算术平均值)

    median(1:4)
    #[1] 2.5
    

例如参见the definition of the statistical median on Wolfram MathWorld


在更数学(也许有趣)的旁注中:

N 个观测值的中位数的不同定义是通过

enter image description here

其中 x 的中位数定义为 y ,它使与所有观测值的L2距离之和最小。

我们可以验证这确实为我们提供了与median相同的中位数:

x <- c(1, 1:4)
x[which.min(sapply(x, function(y) sum(x - y)^2))]
#[1] 2

median(x)
#[1] 2

关于替代定义的有趣之处在于,它允许将单变量中值扩展到高维空间中一组点的geometric median。思考:3维欧几里得空间中三点的中位数是多少?