Вы можете просто переранжировать данные.
n <- 100
x <- rnorm(n)
x <- (x - mean(x))/sd(x)
mean(x) # 0, up to machine precision
sd(x) # 1
Вы также можете использовать ppoints
, чтобы равномерно отстоящие друг от друга точки (вам все равно придется масштабировать, хотя).
x <- qnorm(ppoints(n))
x <- (x - mean(x))/sd(x)
mean(x)
sd(x)
В более высоком измерении преобразование немного сложнее. Если x
является гауссовым вектором со средним нулем и дисперсией, то единичная матрица затем C %*% x
является гауссовой, с нулевым средним значением и матрицей дисперсии V = CC'
. C
- преобразование Холецкого V
; его можно рассматривать как аналог квадратного корня для (симметричных, положительных полуопределенных) матриц.
Необходимы две из этих преобразований: первый, чтобы установить дисперсию на идентичность, а второй - на нужное значение.
# Desired variance matrix
V <- matrix(c(1,.2,.2, .2,1,.2, .2,.2,1), 3, 3)
# Random data
n <- 100
k <- 3
x <- matrix(rnorm(k*n), nc=3)
# Set the mean to 0, and the variance to the identity
x <- t(t(x) - colMeans(x))
colMeans(x) # 0
C1 <- chol(var(x))
x <- x %*% solve(C1)
var(x) # identity matrix
# Set the variance to the desired value
C2 <- chol(V)
x <- x %*% C2
var(x) - V # zero
Вы хотите, чтобы образец имел среднее значение, равное населению? Я сомневаюсь, что это возможно. – Nishanth
Вы спрашиваете, как это сделать в R или python? Или другое? Вы всегда можете просто заставить свои сгенерированные данные иметь среднее и стандартное отклонение интереса, используя линейное преобразование. – Dason
Также вы просто заинтересованы в том, чтобы сделать это для случая Гаусса или вы хотите сделать это для любого распространения в целом? – Dason