【问题标题】:Iterations in RR中的迭代
【发布时间】:2014-01-10 18:57:26
【问题描述】:

对于给定的观测向量 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 的初学者,所以请尽量保持简单。谢谢。

【问题讨论】:

  • 您可以使用 for 循环进行固定次数的迭代。基本语法是:for(i in 1:10000) { do something }。如果您可以测试收敛性,则可以使用 while 循环来检查每次迭代是否达到足够的收敛性。这最大限度地减少了计算时间(但要确保你的算法确实收敛!)。
  • @AlexanderVosdeWael 我该如何替换我的参数向量呢?
  • 继续阅读apply函数。

标签: r statistics simulation


【解决方案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)
}

真的没有太大变化。将其包装在一个循环中,确保保存新的估计值以替换旧的估计值,以便您的循环执行某些操作。你有一些缺失的括号和错别字。不要害怕使用空格,并确保关闭所有开口 ([{ 等。

【讨论】:

  • 好的,谢谢。所以当我输入 theta0 时,我会得到 10000 次迭代的估计值,每次都替换了参数向量?
  • 是的。您正在覆盖 theta0 10000 次(或 9999,我不擅长数学:))。如果您想在每次迭代中看到它,请添加print(theta0)(不推荐)。或者你可以说if (i %% 500 == 0) print(theta0)。这可能会更好
猜你喜欢
  • 2014-04-30
  • 2018-05-06
  • 2021-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多