2015-03-10 3 views
1

могут быть некоторые потоки на петлях, но я борюсь с ними. Было бы здорово, если бы кто-то мог помочь новичку R.Моделирование в цикле while

Итак, я пытаюсь выполнить 10000 симуляций из прогноза регрессии выборки, используя параметры прогноза: mean, sd. К счастью, мои данные нормальные.

Это то, что у меня есть

N<-10000 
i<-1:N 
k<-vector(,N) 
while(i<N+1){k(,i)=vector(,rnorm(N,mean=.004546,sd=.00464163))} 

... и я получаю эту ошибку

Error in vector(, rnorm(5000, mean = 0.004546, sd = 0.00464163)) : 
invalid 'length' argument 
In addition: Warning message: 
In while (i < N + 1) { : the condition has length > 1 and only the first element will be used 

я не могу получить мою голову вокруг него.

ответ

0

попробуйте этот

N<-10 
i<-1 
k<-matrix(0,1,N) 
while(i<N+1){k[i]=rnorm(1,mean=.004546,sd=.00464163) 
i=i+1 
} 
print(k) 
2

Нет причин для создания петли здесь. Если вы хотите поставить 10000 образцов, нормально распределенные вокруг среднего = 0.004546 и с.о. = 0.00464163 в вектор к, просто сделать:

k <- rnorm(10000,mean = 0.004546, sd = 0.00464163) 
0

Чтобы решить проблему, используйте ответ @Esben Friis'. Вы делаете жесткий подход к легкой проблеме.

Чтобы адресовать вопросы, которые вы имели о сообщениях об ошибках вы получили, однако:

Error in vector(, rnorm(5000, mean = 0.004546, sd = 0.00464163)) : 
invalid 'length' argument 

Это неправильный путь, как vector() будет производить вектор заданной длины вместо набора значений. Вы думаете о функции as.vector():

as.vector(rnorm(5000, mean = 0.004546, sd = 0.00464163)) 

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

Лучше всего просто использовать:

rnorm(5000, mean=0.004546, sd=0.00464163) 

Далее:

In addition: Warning message: 
In while(i<N+1){: the condition has length>1 and only the first element will be used 

Это предупреждение связано с i как вектор 1:N с длиной больше 1. Предупреждающие гласит, что только первый индекс в i будет переработан (используется во всех экземплярах цикла), который является таким же, как и для i[1].

while(i<N+1){ } 
#is the same as 
while(i[1]<N+1){ } 

Вместо этого вы хотите, чтобы петля новое значение N. Кроме того, вы можете использовать <= (меньше или равно) оператора, а не делать <N+1.

while(newVal<=N){ } 

Этот метод принесет новые проблемы, которые могут быть решены с помощью for() петли вместо этого, но это, однако, выходит за рамки вопроса и на самом деле не правильный подход к вашей проблеме, как указано в начало. Надеюсь, ты что-то узнал и удачи!

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