เกี่ยวกับคำขอของคุณสำหรับเอกสารมี:
นี่ไม่ใช่สิ่งที่คุณกำลังมองหา แต่อาจทำหน้าที่เป็นโรงโม่แป้ง
มีกลยุทธ์อีกอย่างที่ไม่มีใครพูดถึง เป็นไปได้ที่จะสร้างข้อมูลสุ่ม (หลอก) จากชุดขนาดซึ่งทั้งชุดมีคุณสมบัติตรงตามข้อ จำกัดตราบใดที่ข้อมูลที่เหลือถูกแก้ไขในค่าที่เหมาะสม ค่าที่ต้องการควรแก้ไขได้ด้วยระบบสมการพีชคณิตและจาระบีข้อศอก N−kNkkk
ยกตัวอย่างเช่นการสร้างชุดของข้อมูลจากการแจกแจงแบบปกติที่จะมีตัวอย่างให้หมายถึงและแปรปรวนคุณจะต้องแก้ไขค่าของจุดสองจุด:และZเนื่องจากค่าเฉลี่ยตัวอย่างคือ:ต้อง:
ความแปรปรวนตัวอย่างคือ:
ดังนั้น (หลังจากแทนที่ข้างต้นสำหรับ , การกระจาย / กระจายและจัดเรียงใหม่ ... ) เราได้รับ:
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
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
ถ้าเราใช้ ,และเป็นปฏิเสธของ RHS เราสามารถแก้ปัญหาสำหรับโดยใช้สูตรสมการกำลังสอง
ตัวอย่างเช่นในสามารถใช้รหัสต่อไปนี้:
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
มีบางสิ่งที่จะเข้าใจเกี่ยวกับวิธีการนี้ อันดับแรกไม่รับประกันว่าจะทำงาน ยกตัวอย่างเช่นมันเป็นไปได้ว่าครั้งแรกของคุณข้อมูลเช่นว่าไม่มีค่าและมีอยู่ที่จะทำให้ความแปรปรวนของผลจากการตั้งค่าเท่ากับ 2 พิจารณา: 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
ประการที่สองในขณะที่การกำหนดมาตรฐานทำให้การกระจายเล็กน้อยของตัวแปรทั้งหมดของคุณมีความเหมือนกันมากขึ้นวิธีการนี้มีผลเฉพาะค่าสองค่าสุดท้ายเท่านั้น
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
}
ประการที่สามตัวอย่างผลลัพธ์อาจดูไม่ปกติ มันอาจดูเหมือนว่ามี 'ค่าผิดปกติ' (เช่นจุดที่มาจากกระบวนการสร้างข้อมูลที่แตกต่างจากส่วนที่เหลือ) เนื่องจากเป็นกรณี นี่เป็นโอกาสน้อยที่จะมีปัญหากับขนาดตัวอย่างที่ใหญ่กว่าเนื่องจากสถิติตัวอย่างจากข้อมูลที่สร้างขึ้นควรรวมเข้ากับค่าที่ต้องการและทำให้ต้องมีการปรับเปลี่ยนน้อยลง ด้วยตัวอย่างขนาดเล็กคุณสามารถรวมวิธีการนี้กับอัลกอริทึมการยอมรับ / ปฏิเสธที่พยายามอีกครั้งหากตัวอย่างที่สร้างขึ้นมีสถิติรูปร่าง (เช่นความเบ้และความโด่ง) ที่อยู่นอกขอบเขตที่ยอมรับได้ (cf. , @ cardinal's comment ) หรือขยาย วิธีนี้เพื่อสร้างตัวอย่างที่มีค่าเฉลี่ยคงที่ความแปรปรวนความเบ้และkurtosis (ฉันจะทิ้งพีชคณิตให้คุณ) อีกวิธีหนึ่งคุณสามารถสร้างตัวอย่างจำนวนน้อยและใช้ตัวอย่างที่มีค่าสถิติ 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