【问题标题】:In R, how to write optim() output to text file from within a function called multiple times在 R 中,如何从多次调用的函数中将 optim() 输出写入文本文件
【发布时间】:2014-04-17 02:14:57
【问题描述】:

我在根据特定条件重复调用的函数中使用 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)
}

文本文件应如下所示:


第二季度 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

$消息 [1]“收敛:REL_REDUCTION_OF_F


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

【问题讨论】:

    标签: r optimization sink


    【解决方案1】:

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

    另外你在函数内部有ans,但是自动打印不会在函数内部发生,如果你想打印ans,那么你需要直接使用print函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-14
      • 2020-07-03
      • 1970-01-01
      • 2020-05-24
      • 2019-03-11
      相关资源
      最近更新 更多