右侧(或左侧)修剪平均值

use*_*324 3 r

使用:

mean (x, trim=0.05)
Run Code Online (Sandbox Code Playgroud)

从分布的每一侧移除2.5%,这对于对称的双尾数据是好的.但是,如果我有一个有尾或高度不对称的数据,我希望能够只删除分布的一侧.有这个功能还是我自己写了一个新功能?如果是这样,怎么样?

42-*_*42- 5

只需创建一个修改过的mean.default.首先来看看mean.default:

mean.default
Run Code Online (Sandbox Code Playgroud)

然后修改它以接受新参数:

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))
}
Run Code Online (Sandbox Code Playgroud)


Bra*_*ney 4

我不知道有什么功能。像下面这样的东西会在取平均值之前修剪掉分布的上尾部。

upper.trim.mean <- function(x,trim) {
  x <- sort(x) 
  mean(x[1:floor(length(x)*(1-trim))])
}
Run Code Online (Sandbox Code Playgroud)