我整天被R分位数功能迷惑了。
我有一个关于分位数如何工作的直观概念,以及M.S.在统计数据,但男孩哦,男孩,它的文档让我感到困惑。
来自文档:
Q [i](p)=(1-gamma)x [j] + gamma X [J + 1],
到目前为止,我还在用它。对于类型 i 分位数,它是x [j]和x [j + 1]之间的插值,基于一些神秘常数 gamma
其中1 <= i <= 9,(j-m)/ n&lt; = p&lt; (j-m + 1)/ n,x [j]是第j个顺序 统计,n是样本大小,m 是由样本确定的常数 分位数型。伽马依赖于此 g = np + m-j的小数部分。
那么,如何计算j?米?
对于连续样本分位数 类型(4到9),样本 分位数可以通过线性获得 第k顺序之间的插值 统计和p(k):
p(k)=(k - alpha)/(n - alpha - beta + 1), 其中α和β是确定的常数 按类型。此外,m = alpha + p(1 - alpha - beta),gamma = g。
现在我真的迷路了。 p,之前是一个常数,现在显然是一个函数。
对于Type 7分位数,默认为......
输入7
p(k)=(k-1)/(n-1)。在这种情况下,p(k)=模式[F(x [k])]。这由S.使用。
有人想帮帮我吗?特别是我对p是一个函数和一个常量的符号感到困惑,它是什么, m ,现在为某些特定的 p 计算j。
我希望根据这里的答案,我们可以提交一些修改后的文档,更好地解释这里发生了什么。
quantile.R source code 或者输入:quantile.default
答案 0 :(得分:56)
你可以理解我很困惑。那份文件很糟糕。我不得不回到它的基础上(Hyndman,RJ; Fan,Y。(1996年11月)。“统计包中的分数样本”。美国统计学家 50(4):361-365 。doi:10.2307/2684934)获得理解。让我们从第一个问题开始。
其中1 <= i <= 9,(j-m)/ n&lt; = p&lt; (j-m + 1)/ n,x [j]是第j阶统计量,n是样本大小,m是由样本分位数类型确定的常数。这里γ取决于g = np + m-j的小数部分。
第一部分直接来自论文,但文档编写者遗漏的是j = int(pn+m)
。这意味着Q[i](p)
仅取决于最接近(排序)观察的p
分数的两个顺序统计。 (对于像我这样不熟悉这个术语的人来说,一系列观察的“顺序统计”就是排序系列。)
另外,最后一句话是错的。它应该读
这里γ取决于np + m的分数部分,g = np + m-j
至于m
这很简单。 m
取决于选择的9种算法中的哪一种。因此Q[i]
就像分位数函数一样,m
应该被视为m[i]
。对于算法1和2,m
为0,对于3,m
为-1/2,对于其他算法,则在下一部分。
对于连续样本分位数类型(4到9),样本分位数可以通过第k阶统计量与p(k)之间的线性插值获得:
p(k)=(k-alpha)/(n-alpha-beta + 1),其中α和β是由类型确定的常数。此外,m =α+ p(1-α-β),γ= g。
这真令人困惑。文档调用的内容p(k)
与之前的p
不同。 p(k)
是plotting position。在论文中,作者将其写为p
k
,这有助于。特别是因为在m
的表达式中,p
是原始p
和m = alpha + p * (1 - alpha - beta)
。从概念上讲,对于算法4-9,点(p
k
,x[k]
)进行插值以获得解(p
,{{ 1}})。每种算法仅在Q[i](p)
p
的算法中有所不同。
至于最后一位,R只是陈述了S的用途。
原始论文给出了6个“样本分位数”的理想属性列表,并列出了对#8的偏好,满足所有这些#1。#5满足所有这些,但他们不喜欢其他理由(它比现象学更为现象学)。 #2是像我这样的非统治极客会考虑分位数,并且是维基百科中描述的内容。
顺便说一句,为了回应dreeves answer,Mathematica做了很多不同的事情。我想我理解了映射。虽然Mathematica更容易理解,但(a)用无意义的参数更容易用脚射击自己,(b)它不能做R的算法#2。 (这里是Mathworld's Quantile page,它指出Mathematica不能做#2,但是根据四个参数给出了所有其他算法的更简单的推广。)
答案 1 :(得分:5)
当你给它一个向量时,有各种计算分位数的方法,并且没有已知的CDF。
考虑当你的观察结果不完全落在分位数上时该怎么做的问题。
“类型”只是决定如何做到这一点。因此,方法说,“在第k阶统计量和p(k)之间使用线性插值”。
那么,什么是p(k)?一个人说,“好吧,我喜欢用k / n”。另一个人说,“我喜欢使用(k-1)/(n-1)”等。这些方法中的每一种都有不同的属性,更适合一个或另一个问题。
\ alpha和\ beta只是参数化函数p的方法。在一种情况下,它们是1和1.在另一种情况下,它们是3/8和-1/4。我不认为p在文档中是永恒的。他们并不总是明确地显示依赖关系。
当你输入像1:5和1:6这样的向量时,看看不同类型会发生什么。
(另请注意,即使您的观察结果完全落在分位数上,某些类型仍会使用线性插值)。
答案 2 :(得分:1)
我相信R帮助文档在@RobHyndman的注释中指出的修订之后就很清楚了,但是我发现它有点让人不知所措。我会发布此答案,以防它帮助某人快速了解选项和他们的假设。
要掌握quantile(x, probs=probs)
,我想查看源代码。这也比我在R中预期的要难,因此我实际上只是从看起来足够新的github repo中抢了过来。我对默认(类型7)的行为感兴趣,因此我对其中的一些进行了注释,但对每个选项却没有做同样的事情。
您可以在代码中看到“类型7”方法是如何逐步进行插值的,而且我还添加了几行内容来打印一些重要的值。
quantile.default <-function(x, probs = seq(0, 1, 0.25), na.rm = FALSE, names = TRUE
, type = 7, ...){
if(is.factor(x)) { #worry about non-numeric data
if(!is.ordered(x) || ! type %in% c(1L, 3L))
stop("factors are not allowed")
lx <- levels(x)
} else lx <- NULL
if (na.rm){
x <- x[!is.na(x)]
} else if (anyNA(x)){
stop("missing values and NaN's not allowed if 'na.rm' is FALSE")
}
eps <- 100*.Machine$double.eps #this is to deal with rounding things sensibly
if (any((p.ok <- !is.na(probs)) & (probs < -eps | probs > 1+eps)))
stop("'probs' outside [0,1]")
#####################################
# here is where terms really used in default type==7 situation get defined
n <- length(x) #how many observations are in sample?
if(na.p <- any(!p.ok)) { # set aside NA & NaN
o.pr <- probs
probs <- probs[p.ok]
probs <- pmax(0, pmin(1, probs)) # allow for slight overshoot
}
np <- length(probs) #how many quantiles are you computing?
if (n > 0 && np > 0) { #have positive observations and # quantiles to compute
if(type == 7) { # be completely back-compatible
index <- 1 + (n - 1) * probs #this gives the order statistic of the quantiles
lo <- floor(index) #this is the observed order statistic just below each quantile
hi <- ceiling(index) #above
x <- sort(x, partial = unique(c(lo, hi))) #the partial thing is to reduce time to sort,
#and it only guarantees that sorting is "right" at these order statistics, important for large vectors
#ties are not broken and tied elements just stay in their original order
qs <- x[lo] #the values associated with the "floor" order statistics
i <- which(index > lo) #which of the order statistics for the quantiles do not land on an order statistic for an observed value
#this is the difference between the order statistic and the available ranks, i think
h <- (index - lo)[i] # > 0 by construction
## qs[i] <- qs[i] + .minus(x[hi[i]], x[lo[i]]) * (index[i] - lo[i])
## qs[i] <- ifelse(h == 0, qs[i], (1 - h) * qs[i] + h * x[hi[i]])
qs[i] <- (1 - h) * qs[i] + h * x[hi[i]] # This is the interpolation step: assemble the estimated quantile by removing h*low and adding back in h*high.
# h is the arithmetic difference between the desired order statistic amd the available ranks
#interpolation only occurs if the desired order statistic is not observed, e.g. .5 quantile is the actual observed median if n is odd.
# This means having a more extreme 99th observation doesn't matter when computing the .75 quantile
###################################
# print all of these things
cat("floor pos=", c(lo))
cat("\nceiling pos=", c(hi))
cat("\nfloor values= ", c(x[lo]))
cat( "\nwhich floors not targets? ", c(i))
cat("\ninterpolate between ", c(x[lo[i]]), ";", c(x[hi[i]]))
cat( "\nadjustment values= ", c(h))
cat("\nquantile estimates:")
}else if (type <= 3){## Types 1, 2 and 3 are discontinuous sample qs.
nppm <- if (type == 3){ n * probs - .5 # n * probs + m; m = -0.5
} else {n * probs} # m = 0
j <- floor(nppm)
h <- switch(type,
(nppm > j), # type 1
((nppm > j) + 1)/2, # type 2
(nppm != j) | ((j %% 2L) == 1L)) # type 3
} else{
## Types 4 through 9 are continuous sample qs.
switch(type - 3,
{a <- 0; b <- 1}, # type 4
a <- b <- 0.5, # type 5
a <- b <- 0, # type 6
a <- b <- 1, # type 7 (unused here)
a <- b <- 1 / 3, # type 8
a <- b <- 3 / 8) # type 9
## need to watch for rounding errors here
fuzz <- 4 * .Machine$double.eps
nppm <- a + probs * (n + 1 - a - b) # n*probs + m
j <- floor(nppm + fuzz) # m = a + probs*(1 - a - b)
h <- nppm - j
if(any(sml <- abs(h) < fuzz)) h[sml] <- 0
x <- sort(x, partial =
unique(c(1, j[j>0L & j<=n], (j+1)[j>0L & j<n], n))
)
x <- c(x[1L], x[1L], x, x[n], x[n])
## h can be zero or one (types 1 to 3), and infinities matter
#### qs <- (1 - h) * x[j + 2] + h * x[j + 3]
## also h*x might be invalid ... e.g. Dates and ordered factors
qs <- x[j+2L]
qs[h == 1] <- x[j+3L][h == 1]
other <- (0 < h) & (h < 1)
if(any(other)) qs[other] <- ((1-h)*x[j+2L] + h*x[j+3L])[other]
}
} else {
qs <- rep(NA_real_, np)}
if(is.character(lx)){
qs <- factor(qs, levels = seq_along(lx), labels = lx, ordered = TRUE)}
if(names && np > 0L) {
names(qs) <- format_perc(probs)
}
if(na.p) { # do this more elegantly (?!)
o.pr[p.ok] <- qs
names(o.pr) <- rep("", length(o.pr)) # suppress <NA> names
names(o.pr)[p.ok] <- names(qs)
o.pr
} else qs
}
####################
# fake data
x<-c(1,2,2,2,3,3,3,4,4,4,4,4,5,5,5,5,5,5,5,5,5,6,6,7,99)
y<-c(1,2,2,2,3,3,3,4,4,4,4,4,5,5,5,5,5,5,5,5,5,6,6,7,9)
z<-c(1,2,2,2,3,3,3,4,4,4,4,4,5,5,5,5,5,5,5,5,5,6,6,7)
#quantiles "of interest"
probs<-c(0.5, 0.75, 0.95, 0.975)
# a tiny bit of illustrative behavior
quantile.default(x,probs=probs, names=F)
quantile.default(y,probs=probs, names=F) #only difference is .975 quantile since that is driven by highest 2 observations
quantile.default(z,probs=probs, names=F) # This shifts everything b/c now none of the quantiles fall on an observation (and of course the distribution changed...)... but
#.75 quantile is stil 5.0 b/c the observations just above and below the order statistic for that quantile are still 5. However, it got there for a different reason.
#how does rescaling affect quantile estimates?
sqrt(quantile.default(x^2, probs=probs, names=F))
exp(quantile.default(log(x), probs=probs, names=F))