将数据转换为特定 mean/sd 但在范围内(即 > 0)

Transform data to specific mean/sd but fall within range (i.e. > 0)

我需要转换一些数据以获得特定的均值和标准差。我正在解决这个问题,除了我需要我的最终答案是肯定的,比如大于 0。

https://stats.stackexchange.com/questions/46429/transform-data-to-desired-mean-and-standard-deviation

有人知道吗?谢谢。

y <- rnorm(1000, mean = 10, sd = 3) # creates normal distributed random data
mean_target <- 5 #desired mean/sd of the data
sd_target   <- 1
y2 <- mean_target + (y - mean(y)) * sd_target/sd(y) #according to the given formula following the link you provided
print(y2)

如果您对负值有疑问,可以将低于零的值削减为零。这当然会稍微改变均值和标准差。

y2[y2 < 0] <- 0

不可能(对于所有正均值和 sd)应用这些特定值并确保所有值都为正值。所以我能想到的唯一方法就是操纵异常值。

重读您的问题让我认为您可能需要一些迭代方法来强制获得所需的均值和标准差。假设您想丢弃异常值(小于零),以下方法可能会有所帮助。但请注意,它可能会显着改变您的数据!

applyMeanSD <- function(y, mean_target, sd_target, max_iter = 10){
    iter <- 0
    while(any(y < 0) || iter < max_iter){
        iter <- iter + 1
        y <- y[y > 0] #throws away all outliers
        if (length(y) > 1)
            y <- mean_target + (y - mean(y)) * sd_target/sd(y)
        else 
            return (NULL)
    }
    return(y)
}

test2 <- applyMeanSD(test <- rnorm(100, 0, 1), 1, 0.5)
test #negative values included
test2 #no negative values
mean(test2)
sd(test2)