2016-10-28 2 views
3

Ich möchte den zentralen Grenzwertsatz simulieren, um es zu demonstrieren, und ich bin nicht sicher, wie man es in R macht. Ich möchte 10.000 Proben mit einer Stichprobengröße von n erzeugen (kann numerisch sein) oder ein Parameter), aus einer Verteilung, die ich wählen werde (einheitlich, exponentiell, etc ...). Dann möchte ich in einem Diagramm (mit den Befehlen par und mfrow) die ursprüngliche Verteilung (Histogramm), die Verteilung der Mittelwerte aller Stichproben, eine QQ-Kurve der Mittelwerte und im vierten Diagramm (es gibt vier, 2X2), Ich bin mir nicht sicher, was ich planen soll. Kannst du mir bitte helfen, es in R zu programmieren? Ich denke, sobald ich die simulierten Daten habe, sollte es mir gut gehen. Vielen Dank.Zentraler Grenzwertsatz in R

Mein erster Versuch ist unten, es ist zu einfach und ich bin mir nicht sicher, sogar richtig.

r = 10000; 
n = 20; 

M = matrix(0,n,r); 
Xbar = rep(0,r); 

for (i in 1:r) 
{ 
    M[,i] = runif(n,0,1); 
} 

for (i in 1:r) 
{ 
    Xbar[i] = mean(M[,i]); 
} 

hist(Xbar); 
+2

Können Sie uns Code zeigen, den Sie zu schreiben begonnen haben? Wir sind kein Code Writing Service. –

Antwort

1

Vielleicht kann dies Ihnen den Einstieg erleichtern. Ich habe die Normalverteilung hart codiert und nur zwei Ihrer vorgeschlagenen Diagramme gezeigt: a das Histogramm einer zufällig ausgewählten Probe und ein Histogramm aller Probenmittel.

Ich denke, mein Hauptvorschlag ist mit einer Liste, um die Proben anstelle einer Matrix zu speichern.

r <- 10000 
my.n <- 20 

simulation <- list() 

for (i in 1:r) { 
    simulation[[i]] <- rnorm(my.n) 
} 

sample.means <- sapply(simulation, mean) 

selected.sample <- runif(1, min = 1, max = r) 

dev.off() 
par(mfrow = c(1, 2)) 
hist(simulation[[selected.sample]]) 
hist(sample.means) 
+0

Warum verwenden Sie 'rnorm', um Samples zu generieren? OP möchte i.i.d generieren. Proben von jeder Verteilung mit bekanntem Mittelwert und Varianz, um CLT für diese Verteilung zu demonstrieren. – aichao

+0

OK, es ist ein paar Jahre her, dass ich wirklich über den zentralen Grenzwertsatz nachgedacht habe. Kann das gewünschte Mittel nicht einfach als zusätzliche Argumente an rnorm übergeben werden? Einverstanden, ich habe nichts unternommen, um die Proben aus einer anderen als der normalen Verteilung zu ziehen. –

+0

Dieser Blogpost macht einen besseren Job der Simulation: https://qualityandinnovation.com/2015/03/30/sampling-distributions-and-central-limit-theorem-in-r/ –

4

Die CLT besagt, dass i.i.d. Stichproben aus einer Verteilung mit Mittelwert und Varianz hat der Stichprobenmittelwert (als Zufallsvariable) eine Verteilung, die mit der Anzahl der Stichproben n zu einer Gaußschen Konvergenz konvergiert. Hier nehme ich an, dass Sie r Probensätze erstellen möchten, die n Proben enthalten, um r Proben des Beispielmittels zu erstellen. Einige Code zu tun, ist wie folgt:

set.seed(123) ## set the seed for reproducibility 
r <- 10000 
n <- 200  ## I use 200 instead of 20 to enhance convergence to Gaussian 

## this function computes the r samples of the sample mean from the 
## r*n original samples 
sample.means <- function(samps, r, n) { 
    rowMeans(matrix(samps,nrow=r,ncol=n)) 
} 

Für die Plots zu erzeugen, verwenden wir ggplot2 und Aarons qqplot.data Funktion von here. Wir verwenden auch gridExtra, um mehrere Diagramme in einem Frame zu plotten.

library(ggplot2) 
library(gridExtra) 
qqplot.data <- function (vec) { 
    # following four lines from base R's qqline() 
    y <- quantile(vec[!is.na(vec)], c(0.25, 0.75)) 
    x <- qnorm(c(0.25, 0.75)) 
    slope <- diff(y)/diff(x) 
    int <- y[1L] - slope * x[1L] 

    d <- data.frame(resids = vec) 

    ggplot(d, aes(sample = resids)) + stat_qq() + geom_abline(slope = slope, intercept = int, colour="red") + ggtitle("Q-Q plot") 
} 

generate.plots <- function(samps, samp.means) { 
    p1 <- qplot(samps, geom="histogram", bins=30, main="Sample Histogram") 
    p2 <- qplot(samp.means, geom="histogram", bins=30, main="Sample Mean Histogram") 
    p3 <- qqplot.data(samp.means) 
    grid.arrange(p1,p2,p3,ncol=2) 
} 

Dann können wir diese Funktionen mit der einheitlichen Verteilung verwenden:

samps <- runif(r*n) ## uniform distribution [0,1] 
# compute sample means 
samp.means <- sample.means(samps, r, n)) 
# generate plots 
generate.plots(samps, samp.means) 

Wir erhalten:

Uniform samples

Oder, mit der poisson Verteilung mit bedeuten = 3:

samps <- rpois(r*n,lambda=3) 
# compute sample means 
samp.means <- sample.means(samps, r, n)) 
# generate plots 
generate.plots(samps, samp.means) 

Wir erhalten:

Poisson samples

Oder, mit der exponentiellen Verteilung mit Mittelwert = 1/1:

samps <- rexp(r*n,rate=1) 
# compute sample means 
samp.means <- sample.means(samps, r, n)) 
# generate plots 
generate.plots(samps, samp.means) 

Wir bekommen:

Exponential samples

Beachten Sie, dass der Mittelwert der Probe bedeutet Histogramme alle aussehen wie Gaussians mit dem Mittelwert, der den Mittelwert der ursprünglichen Erzeugungsverteilung sehr ähnlich ist, ob diese einheitlich ist, poisson, oder exponentiell, wie sie in der CLT vorhergesagt (auch seine Varianz ist 1/(n = 200) die Varianz der ursprünglichen erzeugenden Verteilung).

+0

Vielen Dank, sehr hilfreich. Gibt es eine Möglichkeit, dem Q-Q-Diagramm eine Linie hinzuzufügen? – user2899944

+0

@ user2899944: Ja, siehe meine bearbeitete Antwort. – aichao