2014-01-11 72 views
2

使用:右(或左)側微調平均值

mean (x, trim=0.05) 

從分佈的每一側,這是細爲對稱雙尾數據中移除2.5%。但是,如果我有一個尾部或高度不對稱的數據,我希望能夠刪除分佈的一側。有沒有這個功能,或者我有寫一個新的?如果是這樣,怎麼樣?

回答

2

我不知道一個函數。類似下面的內容在平均值之前會削減分佈的上部尾部。

upper.trim.mean <- function(x,trim) { 
    x <- sort(x) 
    mean(x[1:floor(length(x)*(1-trim))]) 
} 
0
one.sided.trim.mean <- function(x, trim, upper=T) { 
    if(upper) trim = 1-trim 
    data <- mean(x[x<quantile(x, trim)]) 
} 
+0

我假設你打算在這裏調用'mean'。你應該補充一點。另外,可以使用類似(但不完全相同)的構造修剪下部尾部。 –

+0

哎呀哈哈,固定。 –

+0

與Brad McNeney相比,Ur功能給了我一個不同的數字。 – user3083324

3

只需創建一個修改mean.default。首先看mean.default

mean.default 

然後修改它接受一個新的說法:

mean.default <- 
function (x, trim = 0, na.rm = FALSE, ..., side="both") 
{ 
    if (!is.numeric(x) && !is.complex(x) && !is.logical(x)) { 
     warning("argument is not numeric or logical: returning NA") 
     return(NA_real_) 
    } 
    if (na.rm) 
     x <- x[!is.na(x)] 
    if (!is.numeric(trim) || length(trim) != 1L) 
     stop("'trim' must be numeric of length one") 
    n <- length(x) 
    if (trim > 0 && n) { 
     if (is.complex(x)) 
      stop("trimmed means are not defined for complex data") 
     if (any(is.na(x))) 
      return(NA_real_) 
     if (trim >= 0.5) 
      return(stats::median(x, na.rm = FALSE)) 
     lo <- if(side=="both" || side=="right"){ floor(n * trim) + 1 }else{1} 
     hi <- if(side=="both" || side=="left"){ n + 1 - (floor(n * trim) + 1) }else{ n} 
     x <- sort.int(x, partial = unique(c(lo, hi)))[lo:hi] 
     cat(c(length(x), lo , hi)) 
    } 
    .Internal(mean(x)) 
} 
1

這應該佔到任何一方,或者雙方進行修剪。

trim.side.mean <- function(x, trim, type="both"){ 

    if (type == "both") { 
     mean(x,trim)} 
    else if (type == "right") { 
     x <- sort(x) 
     mean(x[1:floor(length(x)*(1-trim))])} 
    else if (type == "left"){ 
     x <- sort(x) 
     mean(x[max(1,floor(length(x)*trim)):length(x)])}} 
相關問題