논문 요청과 관련하여 다음이 있습니다.
이것은 당신이 찾고있는 것이 아니지만 제 분소를 위해 가장 어리석은 역할을 할 수 있습니다.
아무도 언급하지 않은 다른 전략이 있습니다. 나머지 데이터가 적절한 값으로 고정 되는 한 전체 세트가 제약 조건을 만족하도록 크기 의 세트로부터 (의사) 랜덤 데이터 를 생성하는 것이 가능하다 . 필요한 값은 방정식, 대수 및 팔꿈치 그리스 시스템으로 해결할 수 있어야합니다 . N k k kN−kNkkk
예를 들어, 주어진 표본 평균 및 분산 가있는 정규 분포에서 데이터 세트를 생성 하려면 와 의 두 점 값을 수정해야합니다 . 샘플 평균은 다음과 같습니다. 는 다음과 같아야합니다.
표본 분산은 다음과 같습니다.
( 위의 내용으로 바꾸고, 호일 / 배포, 재배 열한 후 ... ) 우리는 얻는다 :
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
둘째, 표준화는 모든 변수의 한계 분포를보다 균일하게 만드는 반면,이 방법은 마지막 두 값에만 영향을 미치지 만 한계 분포는 왜곡됩니다.
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 's comment ) 범위를 벗어난 모양 통계 (예 : 왜도 및 첨도)가 있거나 다시 시도하는 승인 / 거부 알고리즘과이 방법을 항상 결합 할 수 있습니다. 이 방법은 고정 평균, 분산, 왜도 및첨도 (하지만 나는 대수를 당신에게 맡길 것입니다). 또는 적은 수의 샘플을 생성하고 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