【问题标题】:printing function output correctly打印功能正确输出
【发布时间】:2013-12-18 22:40:06
【问题描述】:

我编写了这个函数来查找非线性回归的起始值。我已经测试了其中的循环,它可以完美地工作,以及在列表中搜索最小的 RSS。但是,当我将所有代码放在一个函数中时,打印的结果是第一次迭代的结果,而不是我需要的结果。

有谁知道为什么会发生这种情况?不知道是不是和函数末尾打印列表有关。

LSTR1_val <- function(series, linear, nonlinear, trans){

linear <- c (0,linear)

  linear_list           <- lapply (linear, function(i) lag(series, k=-i))
  linear_dat            <- na.omit(do.call(cbind, linear_list))
  colnames(linear_dat)  <- paste0 ("lag_",linear)

  nonlinear_list           <- lapply (nonlinear, function(i) lag(series, k=-i))
  nonlinear_dat            <- do.call(cbind, nonlinear_list)
  colnames(nonlinear_dat)  <- paste0 ("nl.lag_",nonlinear)  
  nonlinear_dat            <- window (nonlinear_dat, start=start(linear_dat),end=end(linear_dat))

  trans       <- window (trans, start=start(linear_dat),end=end(linear_dat))
  scale       <- sqrt   (var(trans))
  grid        <- list()


  lin_eq                <- paste0("lag_0 ~",  paste(paste(colnames(linear_dat)[-1]), sep="",collapse='+'))      
  nonlin_eq             <- paste0("transition + ",paste("I(transition*",paste(colnames(nonlinear_dat),")"), sep="",collapse='+'))

for (c1 in seq(0.97*min(trans), 0.97*max(trans), mean(trans)/5)){
  for (gamma in seq(1,100,2))                                    {

    transition  <- (1+exp(-(gamma/scale)*(trans-c1)))^-1

    grid.regre <-lm(paste0(lin_eq,"+",nonlin_eq),data=data.frame(linear_dat,nonlinear_dat,trans)) 

    coef  <- grid.regre$coefficients
    RSS   <- sum(grid.regre$residuals^2)
    grid[[length(grid)+1]] <- c(RSS,gamma,c1,coef)  
  } 
}

Small_RSS         <- which.min(sapply(grid, "[[", 1))  
Start_val         <- grid[[Small_RSS]]
names(Start_val)  <- c("RSS","gamma","c1",c("intercept",colnames(linear_dat)[-1],"nl_intercept",colnames(nonlinear_dat)))

Resultados <- list(Recomendacion= "Use los valores iniciales:",Ini_val=Start_val)
print(Resultados)

 }

【问题讨论】:

    标签: r function loops printing output


    【解决方案1】:

    我不熟悉您的上下文,但从您的代码来看,这里很可能出现问题:

    grid.regre <-lm(paste0(lin_eq,"+",nonlin_eq),data=data.frame(linear_dat,nonlinear_dat,trans)) 
    

    注意你写了RSS &lt;- sum(grid.regre$residuals^2),你说RSS在每次迭代后都不会改变。这意味着grid.regre 在每次迭代后都不会改变。从上面,我进一步缩小到

    data.frame(linear_dat,nonlinear_dat,trans)
    

    这里的trans是否应该按照上一步计算的那样指定为transition?请注意,transition 每次迭代都会发生变化,因为外部循环中的变量 c1 会发生变化。因此,请尝试确定每次迭代的data.frame 是否不同。

    【讨论】:

    • 嗨,小男孩。谢谢你的帮助。我可以告诉你,循环工作正常。如果我从线性的定义中获取代码,到 Start_val,然后运行它,我会得到最小的 rss。尝试将代码放入函数并尝试打印结果时遇到问题。
    猜你喜欢
    • 2023-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 1970-01-01
    • 1970-01-01
    • 2022-12-29
    相关资源
    最近更新 更多