1. 程式人生 > >R語言 quantile()和fivenum()的差別在於——加權平均與算術平均(轉載)

R語言 quantile()和fivenum()的差別在於——加權平均與算術平均(轉載)

轉自:http://blog.sina.com.cn/s/blog_a184ae810102xqwe.html quantile()和fivenum()的本質差別在於,quantile()函式的演算法是採用加權平均,fivenum()是算術平均。這麼說可能不易理解,其實很簡單的,下面舉個例子說明就容易理解了。 例如,一組資料 x <- 11 : 18,則如下圖,第一位是11,第二位是12,,,第8位是18,
對於quantile()演算法——加權平均, 0%位第1位1+(8-1)*0%=1),值為11 25%位是第2.75位(1+(8-1)*25%=2.75),第2.75位介於第2位和第3位之間,距離哪位較近,哪位資料的權重較大,所以第3位資料的權重是0.75,第2位資料是權重是0.25,則25%位值=13*0.75+12*0.25=12.75

同理,50%位第4.5位1+(8-1)*50%=4.5),值=14*0.5+15*0.5=14.5 75%位第6.25位1+(8-1)*75%=6.25),值=16*0.75+17*0.25=16.25 100%位第8位1+(8-1)*100%=8),值為18 對於fivenum()演算法——算術平均, 0%位第1位1+(8-1)*0%=1),值為11 25%位是第2.75位(1+(8-1)*25%=2.75),第2.75位介於第2位和第3位之間,用算術平均法,則25%位值=(13+12)/2=12.5 同理,50%位第4.5位1+(8-1)*50%=4.5),值=(14+15)/2=14.5
75%位第6.25位1+(8-1)*75%=6.25),值=(16+17)/2=16.5 100%位第8位1+(8-1)*100%=8),值為18 用r語言驗證:

quantile()的程式碼
  1. x <- 1:100
  2. n <- length(x)
  3. probs = seq(0, 1, 0.25)
  4. index <- 1 + (n - 1) * probs
  5. lo <- floor(index)
  6. hi <- ceiling(index)
  7. x <- sort(x, partial = unique(c(lo, hi)))
  8. qs <- x[lo]
  9. i <- which(index > lo)
  10. h <- (index - lo)[i]
  11. qs[i] <- (1 - h) * qs[i] + h * x[hi[i]]
  12. qs
  13. quantile(x=1:100)
fivenum()的程式碼
  1. x <- 1:100
  2. n <- length(x)
  3. n4 <- floor((n + 3)/2)/2
  4. d <- c(1, n4, (n + 1)/2, n + 1 - n4, n)
  5. 0.5 * (x[floor(d)] + x[ceiling(d)])
  6. fivenum(x=1:100)