Về yêu cầu giấy tờ của bạn, có:
Đây không hoàn toàn là những gì bạn đang tìm kiếm, nhưng có thể đóng vai trò là chuyên gia cho nhà máy.
Có một chiến lược khác mà dường như không ai đề cập đến. Có thể tạo dữ liệu ngẫu nhiên (giả) từ một tập hợp kích thước sao cho toàn bộ tập hợp đáp ứng các ràng buộc miễn là dữ liệu còn lại được cố định ở các giá trị thích hợp. Các giá trị cần thiết phải có thể giải được với một hệ phương trình , đại số và một ít mỡ khuỷu tay. N−kNkkk
Ví dụ: để tạo một tập hợp dữ liệu từ phân phối bình thường sẽ có giá trị trung bình mẫu nhất định, và phương sai, , bạn sẽ cần sửa các giá trị của hai điểm: và . Vì giá trị trung bình của mẫu là: phải là:
Phương sai mẫu là:
do đó (sau khi thay thế ở trên cho , bỏ qua / phân phối và sắp xếp lại ... ) chúng tôi nhận được:
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
Nếu chúng ta lấy , và là phủ định của RHS, chúng ta có thể giải cho bằng
công thức bậc hai . Ví dụ: trong , mã sau đây có thể được sử dụng:
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
Có một số điều cần hiểu về phương pháp này. Đầu tiên, nó không được đảm bảo để làm việc. Ví dụ, có thể dữ liệu ban đầu của bạn sao cho không tồn tại giá trị và sẽ làm cho phương sai của tập kết quả bằng . Xem xét: 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
Thứ hai, trong khi tiêu chuẩn hóa làm cho các phân phối biên của tất cả các biến thể của bạn đồng đều hơn, cách tiếp cận này chỉ ảnh hưởng đến hai giá trị cuối cùng, nhưng làm cho các phân phối biên của chúng bị sai lệch:
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
}
Thứ ba, mẫu kết quả có thể trông không bình thường; có vẻ như nó có 'ngoại lệ' (nghĩa là các điểm đến từ một quá trình tạo dữ liệu khác với phần còn lại), vì thực chất đó là trường hợp. Điều này ít có khả năng là một vấn đề với kích thước mẫu lớn hơn, vì các thống kê mẫu từ dữ liệu được tạo sẽ hội tụ đến các giá trị cần thiết và do đó cần điều chỉnh ít hơn. Với các mẫu nhỏ hơn, bạn luôn có thể kết hợp phương pháp này với thuật toán chấp nhận / từ chối thử lại nếu mẫu được tạo có số liệu thống kê hình dạng (ví dụ: độ lệch và kurtosis) nằm ngoài giới hạn chấp nhận được (xem, nhận xét của @ cardinal ) hoặc mở rộng phương pháp này để tạo ra một mẫu với giá trị trung bình cố định, phương sai, độ lệch vàKurtosis (Mặc dù vậy, tôi sẽ để lại đại số cho bạn). Ngoài ra, bạn có thể tạo một số lượng nhỏ các mẫu và sử dụng một mẫu có thống kê Kolmogorov-Smirnov nhỏ nhất (giả sử).
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