对于给定的观测向量x和给定的参数向量(长度为5),theta0,下面的代码产生了一个更好估计这些参数的矢量theta1。
part1=(1-theta0[5])*dnorm(x,theta0[1],theta0[3])
part2=theta0[5]*dnorm(x,theta0[2],theta0[4])
gam=part2/([part1+part2)
denom1=sum(1-gam)
denom2=sum(gam)
mu1=sum((1-gam)*x)/denom1
sig1=sqrt(sum((1-gam)*((x-mu1)^2))/denom1)
mu2=sum(gam*x)/denom2
sig2=sqrt(sum(gam*((x-mu2)^2))/denom2
p=mean(gam)
theta[1] <- c(mu1,mu2,sig1,sig2,p)
我的问题是如何在不必重新编写代码的情况下迭代过程?我希望theta1替换原始估计的矢量,theta0,theta2来替换theta1等等。收敛速度相当慢,所以我想要进行10000次迭代。有方便的捷径吗?
PS你可能会说,我是R的初学者,所以请尽量保持简单。谢谢。
答案 0 :(得分:1)
未测试
theta0 <- c()
x <-
for (i in 1:10000) {
part1 = (1 - theta0[5])*dnorm(x,theta0[1],theta0[3])
part2 = theta0[5] * dnorm(x,theta0[2],theta0[4])
gam = part2 / (part1 + part2)
denom1 = sum(1-gam)
denom2 = sum(gam)
mu1 = sum((1-gam)*x) / denom1
sig1 = sqrt(sum((1-gam)*((x-mu1)^2))/denom1)
mu2 = sum(gam*x)/denom2
sig2 = sqrt(sum(gam * ((x - mu2) ^ 2)) / denom2)
p = mean(gam)
theta0 <- c(mu1,mu2,sig1,sig2,p)
if (i %% 500 == 0) print(theta0)
}
真的没什么变化。将它包裹在循环中,确保保存新的估计值以替换旧的估计值,以便循环执行某些操作。你有一些丢失的括号和拼写错误。不要害怕使用空格,并确保关闭所有开头(
,[
,{
等。