Con respecto a su solicitud de documentos, hay:
Esto no es exactamente lo que usted está buscando, pero pueden servir de grano para el molino.
Hay otra estrategia que parece que nadie ha mencionado. Es posible generar N-k (pseudo) aleatorios de los datos de un conjunto de tamaño N que todo el conjunto cumple con k restricciones tan largo como el resto de los k de datos, se fijan en los valores adecuados. Los valores requeridos deben ser resueltos con un sistema de k ecuaciones, álgebra, y poco de grasa del codo.
Por ejemplo, para generar un conjunto de N de datos de una distribución normal que tiene una muestra dada decir, \bar x, y la varianza, s^2, usted necesitará para corregir los valores de dos puntos: y y z. Dado que la media de la muestra es:
\bar x = \frac{\sum_{i=1}^{N-2}x_i\; + \;y\!+\!z}{N}
y debe ser:
y = N\bar x\; - \;\left(\sum_{i=1}^{N-2}x_i\!+\!z\right)
La varianza de la muestra es:
s^2 = \frac{\sum_{i=1}^{N-2}(x_i - \bar x)^2\; + \;(y - \bar x)^2\!+\!(z - \bar x)^2}{N-1}
por lo tanto (después de la sustitución de la anterior para y, frustrar / distribución, y reorganizar...), se obtiene:
2(N\bar{x}\! - \!\sum_{i=1}^{N-2}x_i)z - 2z^2 = N\bar{x}^2(N\!-\!1) + \sum_{i=1}^{N-2}x_i^2 + \left[\sum_{i=1}^{N-2}x_i\right)^2 - 2N\bar{x}\sum_{i=1}^{N-2}x_i - (N\!-\!1)s^2
Si tomamos a=-2, b=2(N\bar{x} - \sum_{i=1}^{N-2}x_i) y c como la negación de la RHS, podemos resolver para a z usando la fórmula cuadrática. Por ejemplo, en R
, el siguiente código se puede utilizar:
find.yz = function(x, xbar, s2){
N = length(x) + 2
sumx = sum(x)
sx2 = as.numeric(x%*%x) # this is the sum of x^2
a = -2
b = 2*(N*xbar - sumx)
c = -N*xbar^2*(N-1) - sx2 - sumx^2 + 2*N*xbar*sumx + (N-1)*s2
rt = sqrt(b^2 - 4*a*c)
z = (-b + rt)/(2*a)
y = N*xbar - (sumx + z)
newx = c(x, y, z)
return(newx)
}
set.seed(62)
x = rnorm(2)
newx = find.yz(x, xbar=0, s2=1)
newx # [1] 0.8012701 0.2844567 0.3757358 -1.4614627
mean(newx) # [1] 0
var(newx) # [1] 1
Hay algunas cosas a entender sobre este enfoque. En primer lugar, no está garantizado para trabajar. Por ejemplo, es posible que su inicial N-2 datos son tales que no hay valores y y z existir que hacen de la varianza del conjunto resultante es igual a s^2. Considere la posibilidad de:
set.seed(22)
x = rnorm(2)
newx = find.yz(x, xbar=0, s2=1)
Warning message:
In sqrt(b^2 - 4 * a * c) : NaNs produced
newx # [1] -0.5121391 2.4851837 NaN NaN
var(c(x, mean(x), mean(x))) # [1] 1.497324
Segundo, mientras que la estandarización hace que las distribuciones marginales de todas sus variables más uniforme, este enfoque sólo afecta a los dos últimos valores, pero hace que sus distribuciones marginales sesgada:
set.seed(82)
xScaled = matrix(NA, ncol=4, nrow=10000)
for(i in 1:10000){
x = rnorm(4)
xScaled[i,] = scale(x)
}
![(insert plot)]()
set.seed(82)
xDf = matrix(NA, ncol=4, nrow=10000)
i = 1
while(i<10001){
x = rnorm(2)
xDf[i,] = try(find.yz(x, xbar=0, s2=2), silent=TRUE) # keeps the code from crashing
if(!is.nan(xDf[i,4])){ i = i+1 } # increments if worked
}
![(insert plot)]()
Tercero, la muestra resultante no puede mirar muy normal; podría parecer que se ha 'outliers' (es decir, los puntos que vienen de distintos datos de proceso de generación de que el resto), ya que es esencialmente el caso. Esto es menos probable que sea un problema con muestras de mayor tamaño, como el ejemplo de las estadísticas de los datos generados deben converger los valores necesarios y por lo tanto necesitan menos ajuste. Con muestras más pequeñas, siempre se puede combinar este enfoque con el de aceptar / rechazar algoritmo que intenta de nuevo, si el generado de la muestra tiene forma de estadísticas (por ejemplo, la asimetría y la curtosis) que se encuentran fuera de los límites aceptables (cf., @cardenal del comentario), o extender este enfoque a generar una muestra con un fijo de la media, varianza, asimetría y curtosis (voy a dejar el álgebra hasta que, a pesar de que). Alternativamente, se podría generar un pequeño número de muestras y utilizar el uno con el más pequeño (decir) la prueba de Kolmogorov-Smirnov estadístico.
library(moments)
set.seed(7900)
x = rnorm(18)
newx.ss7900 = find.yz(x, xbar=0, s2=1)
skewness(newx.ss7900) # [1] 1.832733
kurtosis(newx.ss7900) - 3 # [1] 4.334414
ks.test(newx.ss7900, "pnorm")$statistic # 0.1934226
set.seed(200)
x = rnorm(18)
newx.ss200 = find.yz(x, xbar=0, s2=1)
skewness(newx.ss200) # [1] 0.137446
kurtosis(newx.ss200) - 3 # [1] 0.1148834
ks.test(newx.ss200, "pnorm")$statistic # 0.1326304
set.seed(4700)
x = rnorm(18)
newx.ss4700 = find.yz(x, xbar=0, s2=1)
skewness(newx.ss4700) # [1] 0.3258491
kurtosis(newx.ss4700) - 3 # [1] -0.02997377
ks.test(newx.ss4700, "pnorm")$statistic # 0.07707929S
![(add plot)]()