-1

私は次の方程式を持っています、そして私はそれをRで書かなければなりません。ここに画像の説明を入力してください

このコーディングで私が直面している主な課題は、各iと各kについて、組み合わせの合計(分子の二項項)が必要なことです。ここで、min {(nk)、Mi}は、特にk = nの場合、一部のiとkに対して0になる可能性があります。最も重要なのは、ループを0から開始できないことですが、必要です。

ご参考までに、ここに私のコードとデータ(d1)があります。sum<-0私の主な問題である、行の後に0からループを開始する必要があることがわかります。問題を確認してコードを修正していただけますか?0から開始する必要があるループをどうすればよいですか?

n<-4

n^2

id<-1:16

r<-c(1,1,1,1,0,1,1,1,0,1,0,1,1,1,1,1)

tr<-rep(0,n^2)
for(i in 1:n^2){
tr[i]<-ifelse(r[i]==1,rexp(1,1/1),0)
}

t0<-rep(0,n^2)
for(i in 1:n^2){
t0[i]<-ifelse(r[i]==0,rexp(1,1/1.5),0)
}

#Total number of subjects who cannot get B1:

M<-sum(r==0)    #If there were cenoring then M<-sum(r==0 & tr>cenc)

d<-data.frame(id,r,t0,tr)

d1<-d[tr>0,]
d1

d1<-d1[order(d1$tr),]
d1

d1$rank<-1:length(d1$tr)
d1


###Calculating the probability of getting B1 for each subject with r[i]=1:

d1$prob<-rep(0,length(d1$tr))
for(i in 1:length(d1$tr)){  #loop i begins
Mi<-sum(d1$tr[i]>t0[t0>0])
for(k in 1:n){  #loop k begins
sum<-0
for(m in 0:min(n-k,Mi)){    #loop m begins
sum<-sum+choose(Mi,m)*choose(n^2-i-Mi,n-k-m)
}   #loop m ends.
d1$prob[i]<-d1$prob[i]+choose(i-1,k-1)*sum/choose(n^2,n)
}   #loop k ends.
}   #loop i ends.
d1$prob<-d1$prob*1/n
4

1 に答える 1

2

元のコードの問題がわかりませんか?ゼロから始まるベクトルにインデックスを付けることはできませんが、ループ内のイテレータの範囲とは関係ありません。とにかく、これはあなたに同じ答えを与えるはずですが、最も内側のループを避けます:

d1$prob<-rep(0,length(d1$tr))
for(i in 1:length(d1$tr)){  #loop i begins
  Mi<-sum(d1$tr[i]>t0[t0>0])
  for(k in 1:n){  #loop k begins
    # function choose is vectorized, so you can compute all 
    # binomial terms at once given k
    SUM<-sum(choose(Mi,0:min(n-k,Mi))*choose(n^2-i-Mi,n-k-(0:min(n-k,Mi))))
    d1$prob[i]<-d1$prob[i]+choose(i-1,k-1)*SUM
  }   #loop k ends.
}   #loop i ends.
d1$prob<-(d1$prob/choose(n^2,n))*1/n 
#as choose(n^2,n) does not depend on i nor k, 
#you can make the division after the loops for all elements at once
于 2013-03-24T19:30:44.883 に答える