Mengenai permintaan Anda untuk makalah, ada:
Ini bukan apa yang Anda cari, tetapi mungkin berfungsi sebagai gandum bagi pabrik.
Ada strategi lain yang tampaknya tidak ada yang disebutkan. Dimungkinkan untuk menghasilkan data acak (pseudo) dari satu set ukuran N sehingga seluruh set memenuhi kendala k selama data k yang tersisa ditetapkan pada nilai yang sesuai. Nilai yang diperlukan harus dipecahkan dengan sistem persamaan k , aljabar, dan beberapa minyak siku. N- kNkkk
Misalnya, untuk menghasilkan satu set data dari distribusi normal yang akan memiliki rata-rata sampel yang diberikan, ˉ xNx¯ , dan varians, , Anda harus memperbaiki nilai dua titik: y dan z . Karena rata-rata sampel adalah: ˉ x = Σ N - 2 i = 1 x is2yz
yharus:
y=N ˉ x
x¯= ∑N- 2i = 1xsaya+y+zN
y
Varians sampel:
s 2 = Σ N - 2 i = 1 ( x i - ˉ x ) 2y= Nx¯-( ∑i = 1N- 2xsaya+z)
demikian (setelah mengganti
ydi atas, menggagalkan / mendistribusikan, & menata ulang ...) kita mendapatkan:
2(N ˉ xs2= ∑N- 2i = 1( xsaya- x¯)2+( y- x¯)2+( z- x¯)2N- 1
y
Jika kita mengambil
a = - 2 ,
b = 2 ( N ˉ x - ¢2 ( Nx¯-∑i = 1N- 2xsaya) z- 2 z2= Nx¯2( N-1 ) + ∑i = 1N- 2x2saya+ [ ∑i = 1N- 2xsaya]2- 2 Nx¯∑i = 1N- 2xsaya- ( N-1 ) s2
a = - 2, dan
csebagai negasi dari RHS, kita dapat menyelesaikan untuk
zmenggunakan
rumus kuadratik. Misalnya, dalam, kode berikut dapat digunakan:
b = 2 ( Nx¯- ∑N- 2i = 1xsaya)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
Kedua, sedangkan standardisasi membuat distribusi marginal dari semua varian Anda lebih seragam, pendekatan ini hanya memengaruhi dua nilai terakhir, tetapi membuat distribusi marginalnya miring:
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
}
Ketiga, sampel yang dihasilkan mungkin tidak terlihat sangat normal; mungkin terlihat seperti memiliki 'outlier' (yaitu, poin yang berasal dari proses pembuatan data yang berbeda dari yang lain), karena pada dasarnya itulah masalahnya. Ini cenderung menjadi masalah dengan ukuran sampel yang lebih besar, karena statistik sampel dari data yang dihasilkan harus menyatu dengan nilai-nilai yang diperlukan dan dengan demikian membutuhkan penyesuaian yang lebih sedikit. Dengan sampel yang lebih kecil, Anda selalu bisa menggabungkan pendekatan ini dengan algoritma terima / tolak yang mencoba lagi jika sampel yang dihasilkan memiliki statistik bentuk (misalnya, skewness dan kurtosis) yang berada di luar batas yang dapat diterima (lih., Komentar @ cardinal ), atau memperluas pendekatan ini untuk menghasilkan sampel dengan mean tetap, varians, skewness, dankurtosis (saya akan membiarkan aljabar terserah Anda). Atau, Anda dapat menghasilkan sejumlah kecil sampel dan menggunakan sampel dengan statistik Kolmogorov-Smirnov terkecil.
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