Bildiri talebinizle ilgili olarak:
Bu tam olarak aradığınız şey değil, ancak değirmen için bir zafer görevi görebilir.
Kimsenin bahsetmediği başka bir strateji var. Kalan verileri uygun değerlerde sabitlendiği sürece tüm kümenin kısıtlamalarını karşıladığı şekilde bir büyüklüğü kümesinden (sözde) rasgele veri üretmek mümkündür . Gerekli değerler bir denklem sistemi , cebir ve bir miktar dirsek yağı ile çözülebilir olmalıdır . N k k kN-- kN-kkk
Örneğin, belirli bir örnek ortalamasını, ve varyansı, olacak normal bir dağılımdan bir verileri kümesi oluşturmak için , iki noktanın değerlerini düzeltmeniz gerekir: ve . Örnek ortalama şu şekilde olduğundan: olmalı:
Örnek sapması:
, böylece (yukarıdaki ikame sonra / dağıtma folyo, ve yeniden düzenleme ... ) biz alırız:
ˉ x s 2 y z ˉ x = ∑ N - 2 i = 1 x iN-x¯s2yz
yy=N ˉ x
x¯= ∑N-- 2i = 1xben+y+zN-
yy=Nx¯−(∑i=1N−2xi+z)
s2=∑N−2i=1(xi−x¯)2+(y−x¯)2+(z−x¯)2N−1
y a = - 2 b = 2 ( N ˉ x - ∑ N - 2 i = 1 x i ) c z2(Nx¯−∑i=1N−2xi)z−2z2=Nx¯2(N−1)+∑i=1N−2x2i+[∑i=1N−2xi]2−2Nx¯∑i=1N−2xi−(N−1)s2
Eğer , alırsak ve , olarak ,
ikinci dereceden formülünü kullanarak için çözebiliriz . Örneğin, içinde , aşağıdaki kod kullanılabilir:
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
Bu yaklaşım hakkında anlaşılması gereken bazı şeyler var. İlk olarak, çalışacağı garanti edilmez. Örneğin, ilk verilerinizin , elde edilen kümenin varyansını eşit yapacak ve değerlerinin bulunmayacağı şekilde olması mümkündür . Düşünmek: y z s 2N−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
İkincisi, standartlaştırma tüm değişkenlerinizin marjinal dağılımını daha homojen kılarken, bu yaklaşım sadece son iki değeri etkiler, fakat marjinal dağılımlarını çarpıtır:
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
}
Üçüncüsü, elde edilen örnek çok normal görünmeyebilir ; aslında 'aykırılıklara' (yani, diğerlerinden farklı bir veri üretme sürecinden gelen noktalara) sahip gibi görünebilir, çünkü esasen böyledir. Üretilen verilerden alınan örnek istatistiklerin istenen değerlere yakınlaşması ve bu nedenle daha az ayar gerektirmesi gerektiğinden, bu durum daha büyük örneklem büyüklüğüyle ilgili bir sorun olma ihtimalinin düşük olması anlamına gelir. Daha küçük örneklerde, bu yaklaşımı her zaman, oluşturulan örnek kabul edilebilir sınırların dışında (şekil, @ kardinal'in yorumu ) dışında olan şekil istatistiklerine (örn., Çarpıklık ve kurtoz) sahipse veya uzatırsa tekrar deneyen bir kabul / red algoritmasıyla birleştirebilirsiniz. sabit bir ortalama, varyans, çarpıklık vekurtosis (Ben cebiri sana bırakacağım). Alternatif olarak, az sayıda örnek üretebilir ve örneğin en küçük (örneğin) Kolmogorov-Smirnov istatistiklerini kullanabilirsiniz.
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