0

我在根据特定条件重复调用的函数中使用 optim ()。我想将每个 optim() 调用的结果以及正在使用的参数值存储到一个文本文件中。

以下代码给了我一个带有参数值的文本文件,但没有给出优化输出($par、$values、收敛、消息等)

我曾尝试使用 print(ans) 但 optim() 输出会覆盖文本文件中的现有数据。在 optim() 之后放置“flush.console”也没有给我任何结果。

这是我的代码的一部分:

Q2 <- function(s,hf,cumhf) {
    beta<-c(s[1],s[2],s[3])
    alpha<-s[4]
    sigma<-s[5]
    call1<-call1+1
    cat("Q2 ",call1,"\t",s[1],"\t",s[2],"\t",s[3],"\t ",hf[1,1],"\t ",cumhf[1,1],"\t",alpha,"\t",sigma,"\n",file="dump.txt",append=TRUE)
    #browser()
    sink(file="dump.txt",append=TRUE,type=c("output","message"))
    expq2<-function(par){
        alpha<-par[1]
        sigma<-par[2]
        cat("call from expq2 value sigma = ",sigma,"\n",file="dump.txt",append=TRUE)    
        sum2<-0
        for(i in 1:50){
            sum2<-sum2+expectationlogfrailty(i,beta,alpha,sigma)
        }
        return(sum2)
    }
    ans<-optim(c(alpha,sigma),fn=expq2,gr=NULL,method="L-BFGS-B",lower=c(-Inf,0),upper=c(Inf,Inf),control=list(maxit=250,fnscale=-1))
    cat("optim function summary ",append=TRUE)
    ans
    est<-ans$par
    s<-c(beta,est)
    return(s)
}

文本文件应如下所示:


Q2 1 -0.5675807 -0.4689595 -0.06068879 0.02349636 7.792965 0 1
调用来自 expq2 值 sigma = 1
调用来自 expq2 值 sigma = 1

.
.
从 expq2 值 sigma = 2.133043
调用从 expq2 值 sigma = 2.131043
优化函数摘要
$par

1.186385e-06 2.132043e+00

$值 [1] -113.9802

$counts 函数梯度 7 7

$收敛[1] 0

$message [1] "CONVERGENCE: REL_REDUCTION_OF_F <= FACTR*EPSMCH"


这只是对该函数的 1 次调用。最后 5 行给我带来了麻烦,要么没有输出,要么覆盖了文本文件的前 5 行。关于如何每次都将此输出附加到文本文件的任何想法?

4

1 回答 1

0

如果您提前打开文件连接并写入连接(以便它追加)而不是依赖于 and 的追加参数,您可能会有更好的sink运气cat。现在,当另一个函数打开同一个文件并且您丢失缓冲区中的输出时,其中一个命令可能尚未写入文件(将输出保存在缓冲区中)。将两者都写入打开的文件句柄可能会更好。您还可以查看该flush函数以确保每个函数在调用另一个函数之前都已写入其输出。

您也可以ans在函数内部单独使用,但是在函数内部不会发生自动打印,如果要打印,则需要print直接使用该函数。

于 2014-03-12T19:11:19.463 回答