In Bezug auf Ihre Anfrage für Papiere gibt es:
Dies ist nicht ganz das, wonach Sie suchen, könnte aber als Mahlgut für die Mühle dienen.
Es gibt eine andere Strategie, die anscheinend niemand erwähnt hat. Es ist möglich, (Pseudo) Zufallsdaten aus einer Menge der Größe zu erzeugen, so dass die gesamte Menge Bedingungen erfüllt , solange die verbleibenden Daten auf geeignete Werte festgelegt sind. Die erforderlichen Werte sollten mit einem System aus Gleichungen, Algebra und etwas Ellbogenfett lösbar sein . N−kNkkk
Um beispielsweise einen Satz von Daten aus einer Normalverteilung mit einem bestimmten Stichprobenmittelwert ( ) und einer Varianz ( zu generieren , müssen Sie die Werte von zwei Punkten festlegen: und . Da der Stichprobenmittelwert ist: muss sein:
Die Stichprobenvarianz ist:
also (nach Ersetzen von das Obige , Folieren / Verteilen & Umordnen ... ) wir bekommen:
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
Wenn wir , ist und als Negation der RHS können wir mit der
quadratischen Formel nach
auflösen . In könnte beispielsweise der folgende Code verwendet werden:
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
Es gibt einige Dinge zu verstehen, über diesen Ansatz. Erstens ist es nicht garantiert zu arbeiten. Zum Beispiel ist es möglich, dass Ihre anfänglichen Daten so sind, dass keine Werte und existieren, die die Varianz der resultierenden Menge gleich . Erwägen: 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
Zweitens: Während durch die Standardisierung die Randverteilungen aller Ihrer Variablen einheitlicher werden, wirkt sich dieser Ansatz nur auf die letzten beiden Werte aus, führt jedoch zu einer Verschiebung der Randverteilungen:
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
}
Drittens sieht die resultierende Stichprobe möglicherweise nicht ganz normal aus. Es könnte so aussehen, als hätte es Ausreißer (dh Punkte, die aus einem anderen Datenerzeugungsprozess stammen als der Rest), da dies im Wesentlichen der Fall ist. Dies ist bei größeren Stichproben weniger wahrscheinlich, da die Stichprobenstatistik aus den generierten Daten auf die erforderlichen Werte konvergieren sollte und daher weniger Anpassungen erforderlich sind. Bei kleineren Stichproben können Sie diesen Ansatz immer mit einem Annahme- / Ablehnungsalgorithmus kombinieren, der es erneut versucht, wenn die generierte Stichprobe Formstatistiken (z. B. Schiefe und Kurtosis) aufweist, die außerhalb akzeptabler Grenzen liegen (vgl. @ Kardinals Kommentar ) oder erweitert werden dieser Ansatz zur Erzeugung einer Stichprobe mit einem festen Mittelwert, einer festen Varianz, einer festen Schiefe undKurtosis (die Algebra überlasse ich Ihnen). Alternativ können Sie eine kleine Anzahl von Stichproben generieren und die mit der kleinsten Kolmogorov-Smirnov-Statistik verwenden.
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