我使用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会生成一个子集,但该子集由观察总数组成,这可能不正确。任何人都知道语法的错误是什么或如何解决?
提前致谢!
答案 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%等等。只是好奇你是如何解决这个问题的。