Проблемы итерации с циклом while в R - PullRequest
0 голосов
/ 25 июня 2019

Почему итерации цикла while не работают? Мне нужна функция, чтобы сделать итерацию, но она не работает. Вычисления внутри, по-видимому, правы, однако, когда я пытаюсь выполнить итерации с циклом while, он выполняет вычисления только один раз, а не итеративно, как это должно быть Я надеюсь, что вы можете помочь мне

код

iter = 0 крит = 1

while (crit >= tol && iter < maxit) {

iter = iter+1
mu1= matrix(old[1:n], ncol = n)
mu2 = matrix(old[(n+1):(n*2)], ncol = n)
s1 = matrix(old[(n*2+1):(n*2+n*n)], ncol = n)
s2 = matrix(old[(n*6+1):(n*6+n*n)], ncol = n)
df = old[length(old)-2]
lambda = old[length(old)-1]

mixt = lambda*mvtnorm::dmvt(x = x, delta = mu1, sigma = s1, df = 2)+(1-lambda)*mvtnorm::dmvt(x = x, delta = mu2, sigma = s2, df = 2)
H1 = lambda*mvtnorm::dmvt(x = x, delta = mu1, sigma = s1, df = 2) / mixt
H2 = 1- H1
N1 = sum(H1)
N2 = sum(H2)

new$mu[1] = list(apply(X = x, MARGIN = 2, FUN = function(x) {sum(H1*x) / N1}))
new$mu[2] = list(apply(X = x, MARGIN = 2, FUN = function(x) {sum(H2*x) / N2}))
#new$sigma = (lapply(1:k, FUN = function(i){(t(H1*(x-unlist(new$mu[i]))))%*%(t(t(x-unlist(new$mu[i]))))/ N1}))
new$sigma[1] = list((t(H1*(x-unlist(new$mu[1]))))%*%(t(t(x-unlist(new$mu[1]))))/ N1)
new$sigma[2] = list((t(H2*(x-unlist(new$mu[2]))))%*%(t(t(x-unlist(new$mu[2]))))/ N2)
new$k = init$k
new$df = init$df
new$lambda[1] = mean(H1) #In McLachlan is pi 
new$lambda[2] = 1 - new$lambda[1]

solvec = new
crit = abs(unlist(new)-unlist(old))

if (any(is.nan(unlist(solvec)))) break
old=new 

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...