编辑
我无法重现我最初发布的结果。当我第一次得到这些结果时,我关闭了 R,重新启动它,然后再次运行整个过程以确保,我又得到了相同的结果。下面显示的内容完全是从我的 R 控制台复制的。但是,我只是第三次(以及第四次和第五次)尝试了该代码,但它不起作用。我留下我原来的答案,以防万一我遇到了一些事情并且没有意识到它可能对其他人有用,但下面的建议似乎不起作用(至少不是一致的)。
问题似乎确实出在 C 代码中。当我打开ideal
函数并逐行运行时,all.equal
这行代码中的每个输入都返回 TRUE:
output <- .C("IDEAL", PACKAGE = .package.Name, as.integer(n),
as.integer(m), as.integer(d), as.double(yToC), as.integer(maxiter),
as.integer(thin), as.integer(impute), as.integer(mda),
as.double(xp), as.double(xpv), as.double(bp), as.double(bpv),
as.double(xstart), as.double(bstart), xoutput = as.double(rep(0,
n * d * numrec)), boutput = as.double(0), as.integer(burnin),
as.integer(usefile), as.integer(store.item), as.character(file),
as.integer(verbose))
但是,当我多次运行上述代码output$xoutput
时,每次返回的结果都略有不同,即使我set.seed(42)
在每次运行前立即调用。
sessionInfo()
R version 2.15.2 (2012-10-26)
Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit)
locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
attached base packages:
[1] grid splines stats graphics grDevices utils datasets methods base
other attached packages:
[1] SoDA_1.0-5 pscl_1.04.4 vcd_1.2-13 colorspace_1.2-0 gam_1.06.2 coda_0.16-1 lattice_0.20-10 mvtnorm_0.9-9994
[9] MASS_7.3-22
loaded via a namespace (and not attached):
[1] tools_2.15.2
原始答案
该ideal
函数有一个startvals
参数。该参数的默认值为“eigen”。为了使您的调用set.seed
生效,您需要将该参数更改为“随机”。这是您已经尝试过的:
run1 <- simulationResult(
ideal(s109,
normalize=TRUE,
maxiter = 500,
thin = 10,
burnin = 0,
startvals = "eigen"),
seed = 42)
run2 <- simulationResult(
ideal(s109,
normalize=TRUE,
maxiter = 500,
thin = 10,
burnin = 0,
startvals = "eigen"),
seed = 42)
all.equal(run1@firstState, run2@firstState)
[1] TRUE
all.equal(run1@result$xbar, run2@result$xbar)
[1] "Mean relative difference: 0.01832379"
这与startvals
设置为“随机”的情况相同:
run1 <- simulationResult(
ideal(s109,
normalize=TRUE,
maxiter = 500,
thin = 10,
burnin = 0,
startvals = "random"),
seed = 42)
run2 <- simulationResult(
ideal(s109,
normalize=TRUE,
maxiter = 500,
thin = 10,
burnin = 0,
startvals = "random"),
seed = 42)
all.equal(run1@firstState, run2@firstState)
[1] TRUE
all.equal(run1@result$xbar, run2@result$xbar)
[1] TRUE
据我所知,startvals
为了获得可复制的结果,需要设置为“随机”并没有在包文档中明确指出。在我弄清楚之前,我不得不玩它一段时间。