2013-10-15 3 views
5

Можете ли вы объяснить структуру/идею цикла в R-коде? Я не знаю, с чего начать эту домашнюю проблему. Я был в состоянии создать экспоненциальное распределение мне нужно сКак создать петлю

> rexp(n=200, rate=0.5) 

, но теперь мне нужно создать 2000 образцов этого Rexp и вычислить среднее значение для каждого образца. Затем мне нужно вычислить среднее значение и дисперсию 2000 образцов. Я знаю, как найти среднее и дисперсию простого распределения (например: mean(rexp) и var(rexp)), поэтому моя основная проблема заключается в понимании этой концепции цикла и ее воплощении в жизнь.

Так что я начал с внесением:

> rexp(n=200,rate=0.5) 

Тогда я назвал это экспоненциальное распределение:

> exdi = rexp(n=200,rate=0.5) 

Основы примера дела с суммами, я вошел

>y.exdi=vector(length=2000) 
>for(i in 1:2000){y.exdi[ i ]=mean(exdi)} 

В R Workspace не ответила на это, поэтому я назвал эту функцию и попробовал это:

>Twothou = for(i in 1:2000){y.exdi[ i ]=mean(exdi)} 
>mean(Twothou) 

Но тогда я получил сообщение об ошибке:

[1] NA 
Warning message: 
In mean.default(Twothou) : argument is not numeric or logical: returning NA 

Что я должен делать по-другому?

ответ

3

Я думаю, вы должны поставить генератор случайных чисел rexpвнутри ваш for цикла:

y.exdi=vector(length=2000) 
for(i in 1:2000){ 
    y.exdi[ i ]=mean(rexp(n=200,rate=0.5)) 
} 

В противном случае, для каждого i вы просто вычислить среднее значение для фиксированного вектора вне цикла, а не новый генерируемые каждый раз, когда индекс i увеличивается. Имея эти коды выше, вы можете вычислить среднее значение, используя mean(y.exdi), что дает среднее значение средних значений в 2000 году.

2

Вам необходимо создать свой образец распределения в пределах цикл. Попробуйте следующее:

> set.seed(1) 
> y.exdi=vector(length=2000) 
> for(i in 1:2000){ 
+ exdi = rexp(n=200,rate=0.5) 
+ y.exdi[ i ]=mean(exdi) 
+ } 
> mean(y.exdi) 
[1] 2.001149 
> var(y.exdi) 
[1] 0.01987367 
+0

Если ваш ответ не сильно отличается от тех, кто ответил хотя бы на одну секунду быстрее, чем вы, пожалуйста, подумайте об удалении вашего. – flodel

2

Поскольку вам нужно сгенерировать образец 2000 раз, значит, генерация образца должна быть в цикле.

set.seed(1) 
y.exdi <- vector(length=2000, "numeric") 
for (i in 1:2000) 
{ 
    y.exdi[i] <- mean(rexp(200, 0.5)) 
} 

Проблема также с помощью команды

exdi = rexp(n=200,rate=0.5) 

, в котором вы фактически присваивающей к exdi числовой вектор 200 экспоненциально распределенных случайным образом сгенерированных значений, он не определяет функцию. На самом деле, вам не нужно переопределять функцию, вы можете просто позвонить rexp каждый раз.

R также обеспечивает ярлыки для таких вещей.Вы можете получить 2000 означает, что с однострочника

sapply(1:2000, function(x) { mean(rexp(200, 0.5)) }) 
+0

Если ваш ответ не сильно отличается от тех, кто ответил хотя бы на одну секунду быстрее, чем вы, пожалуйста, подумайте об удалении вашего. – flodel

6

Вы только что создали действительно хороший вектор 2000 элементов одного и того же значения - в средствах средней части образца, сваренного для экспоненциального распределения только один раз. Посмотрите, проверив y.exdi в консоли.

Если вы хотите использовать цикл для этого решения, вы должны создать новые и новые образцы на каждой итерации. Вы можете сделать это легко, например. sapply (обертки вокруг петли for) применяется к 1:2000:

sapply(1:2000, function(x) mean(rexp(n = 200, rate = 0.5))) 

Или скорее прямого вызова, например, replicate (который был предназначен для использования для таких случаев):

replicate(2000, mean(rexp(n = 200, rate = 0.5))) 
+2

+1 для 'replicate'. Я бы не рекомендовал подход 'sapply' вообще, поскольку запись функции, которая игнорирует его аргумент, является уродливой. – flodel

+0

@flodel: ... игнорируя тот факт, что 'replicate' wraps' sapply'. :) –

0

Вот два решения. Первому не нужно создавать образец дважды, но анонимная функция и ее возврат списка нечетны. Второй - более чистый, вы получаете имена столбцов, но у вас больше нет привязки к дисперсии одного и того же образца.

library(plyr) 

ldply(1:2000, function(x) {d <- rexp(n = 200, rate = 0.5); c(mean(d), var(d))}) 

ddply(data.frame(x = 1:2000), .(x), summarize, 
    mean = mean(rexp(n = 200, rate = 0.5)), var = var(rexp(n = 200, rate = 0.5))) 

Ваше решение помещает значение в список y.exdi. Если вы посмотрите на его содержимое при построении, оно будет заполнено логическими значениями FALSE. После цикла вы можете повторно проверить его и увидеть, что он имеет среднее значение как его элементы. Вот два одинаково допустимых способа завершить то, что вы пытались сделать с циклами, с несколькими исправленными вещами.

y.exdi <- NULL 
for(i in 1:2000) y.exdi[i] <- mean(rexp(n = 200, rate = 0.5)) 

y.exdi <- vector(length = 2000, mode = "numeric") 
for(i in seq(y.exdi)) y.exdi[i] <- mean(rexp(n = 200, rate = 0.5)) 
Смежные вопросы