Some minor improvements and corrections below
# Simple weighted quantile
#
# v A vector of sortable observations
# w A numeric vector of positive weights
# p The quantile 0<=p<=1
#
# Nothing fancy: no interpolation etc.; NA cases not thought through
wquantile <- function(v,w=rep(1,length(v)),p=.5)
{
if ( !is.numeric(w) || length(v) != length(w) )
stop("Values and weights must be equal-length vectors")
if ( !is.numeric(p) || any( p<0 | p>1) )
stop("Quantiles must be 0<=p<=1")
if ( min(w) < 0 ) stop("Weights must be non-negative numbers")
ranking <- order(v)
sumw <- cumsum(w[ranking])
plist <- sumw / sumw[ length(sumw) ]
sapply(p, function(p) v [ ranking [ which.max( plist >= p ) ] ] )
}
I would appreciate any comments people have on this -- whether
correctness, efficiency, style, ....
-s
Percentiles/Quantiles with Weighting
2 messages · Stavros Macrakis, Dieter Menne
Stavros Macrakis <macrakis <at> alum.mit.edu> writes:
Some minor improvements and corrections below # Simple weighted quantile # # v A vector of sortable observations # w A numeric vector of positive weights # p The quantile 0<=p<=1 # # Nothing fancy: no interpolation etc.; NA cases not thought through wquantile <- function(v,w=rep(1,length(v)),p=.5)
You could compare it with wtd.quantile in Hmisc. Dieter