Я занимался поиском похожих проблем, и у меня есть смутное представление о том, что мне делать: векторизовать все или использовать apply()
семейство. Но я новичок в программировании на R, и оба вышеперечисленных метода довольно запутаны.
Вот мой исходный код:
x<-rlnorm(100,0,1.6)
j=0
k=0
i=0
h=0
lambda<-rep(0,200)
sum1<-rep(0,200)
constjk=0
wj=0
wk=0
for (h in 1:200)
{
lambda[h]=2+h/12.5
N=ceiling(lambda[h]*max(x))
for (j in 0:N)
{
wj=(sum(x<=(j+1)/lambda[h])-sum(x<=j/lambda[h]))/100
for (k in 0:N)
{
constjk=dbinom(k, j + k, 0.5)
wk=(sum(x<=(k+1)/lambda[h])-sum(x<=k/lambda[h]))/100
sum1[h]=sum1[h]+(lambda[h]/2)*constjk*wk*wj
}
}
}
Позвольте мне немного объяснить. Я хочу собрать 200 значений sum1 (это первый цикл), и для каждого значения sum1 это сумма (lambda[h]/2)*constjk*wk*wj
, то есть двух других циклов. Самое утомительное то, что N меняется с h, поэтому я понятия не имею, как векторизовать j-петлю и k-петлю. Но, конечно, я могу векторизовать h-петлю с помощью lambda<-seq()
и N<-ceiling()
, и это лучшее, что я могу сделать. Есть ли способ еще больше упростить код?
sapply
вне цикла только для суммы (x ‹ = j), а затем после этого векторизованных операций). Возможно, появится более сильный ответ, используяouter
для вычислений constjk и wk. - person John   schedule 09.11.2012