重复循环以进行收敛

时间:2013-12-13 20:47:56

标签: r

我有一个4步计算,想要重复2-3步直到收敛。这是一个例子:

muh<-t(rnorm(4))
muk<-t(rnorm(4))
Sigmah<-matrix(rnorm(16),4,4)
Sigmak<-matrix(rnorm(16),4,4)
nh<-nk<-25

步骤1

  muw<-(nh*solve(Sigmah)+nk*solve(Sigmak))^(-1)
    %*%(nh*solve(Sigmah)%*%t(muh)+nk*solve(Sigmak)%*%t(muk))

步骤2

Sigmahw<-Sigmah+(t(muh)-muw)%*%t(t(muh)-muw)
Sigmakw<-Sigmak+(t(muk)-muw)%*%t(t(muk)-muw)

步骤3

 muw<-(nh*solve(Sigmahw)+nk*solve(Sigmakw))^(-1)
    %*%(nh*solve(Sigmahw)%*%t(muh)+nk*solve(Sigmakw)%*%t(muk))

如何重复步骤2和步骤3直到SigmahwSigmakw收敛?

2 个答案:

答案 0 :(得分:2)

muh<-t(rnorm(4))
muk<-t(rnorm(4))
Sigmah<-matrix(rnorm(16),4,4)
Sigmak<-matrix(rnorm(16),4,4)
nh<-nk<-25

threshold <- 0.1
muw<-(nh*solve(Sigmah)+nk*solve(Sigmak))^(-1)%*%(nh*solve(Sigmah)%*%t(muh)+nk*solve(Sigmak)%*%t(muk))
Sigmahw<-Sigmah+(t(muh)-muw)%*%t(t(muh)-muw)
Sigmakw<-Sigmak+(t(muk)-muw)%*%t(t(muk)-muw)
repeat {
    lastSigmahw <- Sigmahw
    lastSigmakw <- Sigmakw
    muw<-(nh*solve(Sigmahw)+nk*solve(Sigmakw))^(-1)%*%(nh*solve(Sigmahw)%*%t(muh)+nk*solve(Sigmakw)%*%t(muk))
    Sigmahw<-Sigmah+(t(muh)-muw)%*%t(t(muh)-muw)
    Sigmakw<-Sigmak+(t(muk)-muw)%*%t(t(muk)-muw)
    difference <-
        norm(Sigmahw - lastSigmahw, type='F') +
        norm(Sigmakw - lastSigmakw, type='F')
    if (difference  < threshold) {
        break
    }
}

你的代码实际上并没有实际收敛,但确保你的方程是正确的。

答案 1 :(得分:1)

使用repeat语句并使用if

检查条件
repeat{
  statements...
  if(condition){
    break
  }
}

您还可以使用while声明

请参阅R文档:http://cran.r-project.org/doc/manuals/R-lang.html#while