使用:右(或左)側微調平均值
mean (x, trim=0.05)
從分佈的每一側,這是細爲對稱雙尾數據中移除2.5%。但是,如果我有一個尾部或高度不對稱的數據,我希望能夠刪除分佈的一側。有沒有這個功能,或者我有寫一個新的?如果是這樣,怎麼樣?
使用:右(或左)側微調平均值
mean (x, trim=0.05)
從分佈的每一側,這是細爲對稱雙尾數據中移除2.5%。但是,如果我有一個尾部或高度不對稱的數據,我希望能夠刪除分佈的一側。有沒有這個功能,或者我有寫一個新的?如果是這樣,怎麼樣?
我不知道一個函數。類似下面的內容在平均值之前會削減分佈的上部尾部。
upper.trim.mean <- function(x,trim) {
x <- sort(x)
mean(x[1:floor(length(x)*(1-trim))])
}
one.sided.trim.mean <- function(x, trim, upper=T) {
if(upper) trim = 1-trim
data <- mean(x[x<quantile(x, trim)])
}
只需創建一個修改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))
}
這應該佔到任何一方,或者雙方進行修剪。
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)])}}
我假設你打算在這裏調用'mean'。你應該補充一點。另外,可以使用類似(但不完全相同)的構造修剪下部尾部。 –
哎呀哈哈,固定。 –
與Brad McNeney相比,Ur功能給了我一個不同的數字。 – user3083324