2016-10-28 3 views
3

Я хочу симулировать центральную предельную теорему, чтобы ее продемонстрировать, и я не уверен, как это сделать в R. Я хочу создать 10 000 образцов с размером выборки n (может быть числовым или параметр), из распределения я выберу (равномерный, экспоненциальный и т. д.). Затем я хочу графически отобразить на одном графике (используя команды par и mfrow) исходное распределение (гистограмма), распределение средств всех выборок, график QQ средств и четвертый график (их четыре, 2X2), Я не уверен, что делать. Не могли бы вы помочь мне начать программировать его в R? Я думаю, что как только у меня будут смоделированные данные, все должно быть хорошо. Спасибо.Центральная предельная теорема в R

Моя первоначальная попытка ниже, это слишком просто, и я не уверен даже в правильности.

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

Можете ли вы показать нам код, который вы начали писать? Мы не являемся службами написания кода. –

ответ

1

Возможно, это может помочь вам приступить к работе. Я строго кодировал нормальное распределение и показывал только два из предложенных графиков: гистограмму случайно выбранного образца и гистограмму всех образцов.

Я предполагаю, что мое основное предложение: , используя список для хранения образцов вместо матрицы.

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

Почему вы используете 'rnorm' для генерации выборок? OP хочет сгенерировать i.i.d. образцы из любого распределения с известным средним значением и дисперсией для демонстрации CLT для этого распределения. – aichao

+0

ОК, прошло несколько лет, так как я действительно думал о центральной предельной теореме. Не может ли желаемое среднее значение и sd быть передано rnorm в качестве дополнительных аргументов? Соглашаясь, я не сделал ничего, чтобы нарисовать образцы из любого распределения, отличного от обычного. –

+0

Это сообщение в блоге делает лучшую работу по моделированию: https://qualityandinnovation.com/2015/03/30/sampling-distributions-and-central-limit-theorem-in-r/ –

4

В CLT указано, что данный i.i.d. образцы из распределения со средним и дисперсией, среднее значение выборки (как случайная величина) имеет распределение, которое сходится к гауссову по мере увеличения числа выборок n. Здесь я буду предполагать, что вы хотите сгенерировать образцы r, содержащие n образцов для создания r образцов образца. Некоторый код, чтобы сделать это следующим образом:

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)) 
} 

Для создания графики, мы используем ggplot2 и qqplot.data функцию Аарона из here. Мы также используем gridExtra для построения нескольких графиков в одном кадре.

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) 
} 

Тогда мы можем использовать эти функции с равномерной распределения:

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) 

Получаем:

Uniform samples

Или с пуассоновского распределения с имею в виду = 3:

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

Получаем:

Poisson samples

Или с экспоненциальной распределения со средним = 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) 

Мы получаем:

Exponential samples

Обратите внимание, что среднее значение выборочного среднего гистограмм все похоже на Gaussians со средним, который очень похож на среднее исходного распределения, генерирующего, является ли форма, пуассоновского или экспоненциальной, как предсказано ЦПТ (также его дисперсия будет 1/(n = 200) дисперсия исходного генерирующего распределения).

+0

Спасибо, очень полезно. Есть ли способ добавить строку в график Q-Q? – user2899944

+0

@ user2899944: Да, см. Мой отредактированный ответ. – aichao

Смежные вопросы