論文のリクエストについては、次のとおりです。
これは、あなたが探しているものとはまったく異なりますが、工場のグリストとして役立つかもしれません。
誰も言及していないように見える別の戦略があります。残りのデータが適切な値に固定されている限り、セット全体が制約を満たすように、サイズセットから(擬似)ランダムデータを生成することができます。必要な値は、方程式、代数、およびいくつかのエルボーグリースのシステムで解ける必要があります。 N−kNkkk
たとえば、与えられたサンプル平均と分散を持つ正規分布からデータのセットを生成するには、と 2点の値を修正する必要があります。サンプルの平均は次のとおりです。は、なければなりません
サンプル分散:
したがって(上記に置き換えた後、フォイル/配布、および再配置... ) 我々が得る:
Nx¯s2yz
x¯=∑N−2i=1xi+y+zN
yy=Nx¯−(∑i=1N−2xi+z)
s2=∑N−2i=1(xi−x¯)2+(y−x¯)2+(z−x¯)2N−1
y2(Nx¯−∑i=1N−2xi)z−2z2=Nx¯2(N−1)+∑i=1N−2x2i+[∑i=1N−2xi]2−2Nx¯∑i=1N−2xi−(N−1)s2
を取る場合、、およびをRHSの否定として、
2次式を使用してを解くことができます。たとえば、では、次のコードを使用できます。
a=−2b=2(Nx¯−∑N−2i=1xi)czR
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
このアプローチについて理解すべきことがいくつかあります。まず、動作が保証されていません。たとえば、初期のデータは、結果セットの分散を等しくする値およびが存在しないようなものである可能性があります。考慮してください: N−2yzs2
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
第二に、標準化はすべての変量の周辺分布をより均一にしますが、このアプローチは最後の2つの値にのみ影響しますが、周辺分布は歪められます:
set.seed(82)
xScaled = matrix(NA, ncol=4, nrow=10000)
for(i in 1:10000){
x = rnorm(4)
xScaled[i,] = scale(x)
}
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
}
第三に、結果のサンプルは非常に正常に見えない場合があります。それは本質的にそうであるため、「外れ値」(つまり、他とは異なるデータ生成プロセスから得られるポイント)があるように見えるかもしれません。これは、生成されたデータからのサンプル統計が必要な値に収束する必要があるため、調整が少なくて済むため、サンプルサイズが大きい場合に問題になる可能性は低くなります。より小さいサンプルでは、生成されたサンプルが許容範囲外の形状統計(歪度や尖度など)を持っている場合に再試行する受け入れ/拒否アルゴリズムとこのアプローチを常に組み合わせることができます(@cardinalのコメントを参照)固定平均、分散、歪度、および尖度(代数はあなたにお任せします)。または、少数のサンプルを生成し、最小の(たとえば)Kolmogorov-Smirnov統計を持つサンプルを使用することもできます。
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