分位数取决于其他变量

时间:2016-07-08 16:15:17

标签: r

这是我的示例数据帧(在R中): 假设我有这些人的年龄和身高。

age <-c(3.1,3.2,3.1,3.2,3.4,
        4.1,4.4,4.5,4.6,4.1,
        5.2,5.1,5.1,5.8,5.9,
        6.3,6.1,6.2,6.2,6.6)

height <- c(1.1, 1.2, 1.0, 1.5, 1.2, 
       1.3, 1.3, 1.6, 1.2, 1.4,
       1.4, 1.2, 1.7, 1.6, 1.5,
       1.5, 1.4, 1.7, 1.6, 1.7)

df <- as.data.frame(cbind(age,height))

现在我计算分位数。

df$percentile <- with(df, cut(height, breaks = quantile(height, 
probs=    seq(0,1, by=0.25)),include.lowest=TRUE, 
                   labels=c("p25","p50","p75","p100")))

现在,我有高度受年龄影响的问题。 我可以根据年龄将样本分成高度分位数吗?例如,年龄为1.5岁的人将处于较高的百分位数,即使这个人在年龄方面相当短暂(见情节)。

enter image description here

1 个答案:

答案 0 :(得分:1)

您熟悉data.table包吗?它是一个使data.frames更易于使用的包。不幸的是,我不知道如何在不使用它的情况下回答您的问题。记住这一点,我认为这正是你要找的。

require(data.table)
df<-data.table(age=runif(100,min=3,max=7))
df[,height:=rnorm(100, mean=.5+age/6, sd=age*.020)]
for(i in 3:6){
  my.breaks=quantile(df[age>=i & age <i+1,]$height)
  df[age>=i & age <i+1, new.percentile:=cut(height,breaks=my.breaks, include.lowest = TRUE, 
                                            labels=c("p25","p50","p75","p100"))]
}

在第一行,我们加载data.table包。然后我们创建一个新的玩具数据集,因为你的数据集太小而无法使用分位数来处理各个年龄段。所以这个data.table有100个观测值,其中年龄来自3到7的均匀分布。然后我们添加一个高度列,其中高度来自正态分布,其中均值和标准差是年龄的函数。这些参数只是任意选择,以获得看起来合理的东西。

接下来,我们制作一个for循环,我们只通过查看年龄列中的一年范围来查找我们的百分位数。然后,我们应用您的代码仅为落在该年龄范围内的数据标记高度百分位数。

这是for循环之后的一些data.table。这是你在找什么?

        age   height        new.percentile
    1: 3.826293 1.049781            p50
    2: 3.903765 1.116287            p75
    3: 3.931612 1.075756            p75
    4: 3.940625 1.165758           p100
    5: 4.191432 1.142972            p25
    6: 4.211323 1.193299            p25
    7: 4.298498 1.192850            p25
    8: 4.794392 1.161370            p25
    9: 4.839184 1.190125            p25
   10: 5.086999 1.195572            p25