通过分位数制作子集

时间:2017-07-14 10:35:58

标签: r subset quantile

我使用quantiles函数创建了大小相等的cut2,现在我想通过4个分位数制作4个不同的子集。

我可以使用子集函数制作第一个和第四个分位数:

quantile1 <- subset (trial, NAG <22.1)

quantile4 <- subset(trial, NAG >=61.6)

但是如果我尝试制作第二和第三分位数的子集,它就不能正常工作,我不明白为什么。这就是我尝试过的:

quantile2<- subset(trial, NAG >=22.1 | NAG<36.8)

quantile3<-subset(trial, NAG >=36.8 | NAG <61.6)

如果我使用此函数,R会生成一个子集,但该子集由观察总数组成,这可能不正确。任何人都知道语法的错误是什么或如何解决?

提前致谢!

2 个答案:

答案 0 :(得分:0)

前一段时间我遇到了同样的问题(here)。我制作了一个GetQuantile功能,对你有所帮助:

GetQuantile<-function(x,q,n){
  # Extract the nth quantile from a time series
  #
  # args:
  #   x = xts object
  #   q = quantile of xts object
  #   n = nthe quantile to extract
  #
  # Returns:
  #   Returns an xts object of quantiles

  # TRUE / FALSE depending on the quantile we are looking for
  if(n==1) # first quantile
    test<-xts((coredata(x[,])<c(coredata(q[,2]))),order.by = index(x))
  else if (n== dim(q)[2]-1) # last quantile
    test<-xts((coredata(x[,])>=c(coredata(q[,n]))),order.by = index(x))
  else # else
    test<-xts(  (coredata(monthly.returns[,])>=c(coredata(q[,n]))) &
                (coredata(monthly.returns[,])<c(coredata(q[,(n+1)])))  ,order.by = index(x))
  # replace NA by FALSE
  test[is.na(test)]<-FALSE
  # we only keep returns for which we need the quantile
  x[test==FALSE]<-NA
  return(x)
}

使用此功能我可以拥有一个xts,其中包含我想要的分位数的所有月回报,以及其他地方的NA。有了这个xts,我可以做一些事情,比如计算每个分位数的平均值。

monthly.returns.stock.Q1<-GetQuantile(stocks.returns,stocks.quantile,1)
rowMeans(monthly.returns.stock.Q1,na.rm = TRUE)

答案 1 :(得分:0)

我遇到了同样的问题。我用过这个:

df$cumsum <- cumsum(df$var) 
# makes cumulative sum of variable; my data were in shares, so they added up 
# to 100

df$quantile <- cut(df$cumsum, c(0, 25, 50, 75, 100, NA), names=TRUE) 
# cuts the cumulative sum at desired percentile

对于没有共享的变量,我使用了摘要中的信息,其中R为您提供分位数,然后根据这些值剪切数据。

问题:您的分位数是否相等?我的意思是,他们都包含25%的观察结果吗?因为我的是块状的...即有些是22%,有些是28%等等。只是好奇你是如何解决这个问题的。