【问题标题】:How to loop over `fitted` objects from `lm`-type models in R?如何从R中的“lm”类型模型中循环“fitted”对象?
【发布时间】:2018-03-13 17:59:39
【问题描述】:

我的最终目标是为任意数量的拟合对象计算 zoo参见下面的函数 pc),例如如下所示的 fit1fit2

不过,我想知道如何循环 fit 对象?具体来说,如果用户提供了 2 个拟合对象,例如 fit1fit2下面),如何为每个拟合对象计算 zoo

library(rstanarm) 
data(kidiq)
d <- kidiq  

fit1 <- stan_glm(kid_score ~ mom_iq,
                data = d,   
                prior = normal(0, 2.5),  
                prior_intercept = normal(0, 10),  
                prior_aux = normal(0, 10)) 

fit2 <- stan_glm(kid_score ~ mom_iq,
                data = d,   
                prior = normal(0, 2.5),  
                prior_intercept = normal(0, 10),  
                prior_aux = cauchy(0, 100))

要对fit 对象进行矢量化或循环的函数:

pc <- function(fit){

      y <- rstanarm::get_y(fit)
  ypred <- rstanarm::posterior_linpred(fit, transform = TRUE)

  if(family(fit)$family == "binomial" && ncol(y) == 2) {
    trials <- rowSums(y)
    y <- y[, 1]
    ypred <- ypred %*% diag(trials)
  }
  e <- -1 * sweep(ypred, 2, y)
  var_ypred <- apply(ypred, 1, var)
  var_e <- apply(e, 1, var)
zoo <- var_ypred / (var_ypred + var_e)
return(zoo)
  }

【问题讨论】:

  • 请注意我理解这个问题;什么不适用于循环或 lapply

标签: r function for-loop vectorization


【解决方案1】:

lapply(list(fit1, fit2), pc) 应该可以工作。

【讨论】:

    【解决方案2】:
    compute=function(){
      for(i in ls()){
        if(class(eval(parse(text=i)))=="lm"){
          print(paste("zoo for",i,pc(eval(parse(text=i)))))
        }
      }
    }
    compute()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-25
      • 2021-03-27
      相关资源
      最近更新 更多