R:使用miceadds lm.cluster的集群强健标准错误 - 子集和权重错误

时间:2017-05-12 16:25:12

标签: r regression r-mice

我正在尝试使用包mouseadds中的lm.cluster函数来获得多重插补数据集的强大聚类标准错误。

我能够运行它的标准版本但是当我尝试添加子集或权重时出现以下错误:

Error in eval(substitute(subset), data, env) : 
..1 used in an incorrect context, no ... to look in

没有子集或权重的示例:

require("mice")
require("miceadds")
data(data.ma01)
# imputation of the dataset: use six imputations
dat <- data.ma01[ , - c(1:2) ]
imp <- mice::mice( dat , maxit=3 , m=6 )
datlist <- miceadds::mids2datlist( imp )
# linear regression with cluster robust standard errors
mod <- lapply(datlist, FUN = function(data){miceadds::lm.cluster( data=data ,         
formula=read ~ paredu+ female ,  cluster = data.ma01$idschool )}  )

# extract parameters and covariance matrix
betas <- lapply( mod , FUN = function(rr){ coef(rr) } )
vars <- lapply( mod , FUN = function(rr){ vcov(rr) } )
# conduct statistical inference
summary(pool_mi( qhat = betas, u = vars ))

以子集打破的示例:

mod <- lapply(datlist, FUN = function(data){miceadds::lm.cluster( data=data ,         
formula=read ~ paredu+ female ,  cluster = data.ma01$idschool, subset=
(data.ma01$urban==1))}  )

Error during wrapup: ..1 used in an incorrect context, no ... to look in

以重量打破的示例:

mod <- lapply(datlist, FUN = function(data){miceadds::lm.cluster( data=data ,         
formula=read ~ paredu+ female ,  cluster = data.ma01$idschool,
weights=data.ma01$studwgt)}  )

Error during wrapup: ..1 used in an incorrect context, no ... to look in

从搜索开始,我认为当通过lm或glm包装器传递这些命令时,我遇到类似的问题(例如:Passing Argument to lm in R within FunctionR : Pass argument to glm inside an R functionPassing the weights argument to a regression function inside an R function

但是,我不确定如何使用插补数据集解决问题。现有的lm.cluster命令。

由于

2 个答案:

答案 0 :(得分:1)

我没有专家,但将权重传递给lm()存在问题。我知道这不是一个理想的情况,但我设法通过将lm.cluster()函数修改为硬编码权重传递然后使用我自己的函数来实现它。

lm.cluster <- function (data, formula, cluster, wgts=NULL, ...) 
{
  TAM::require_namespace_msg("multiwayvcov")
  if(is.null(wgts)) {
    mod <- stats::lm(data = data, formula = formula)
  } else {
    data$.weights <- wgts
    mod <- stats::lm(data = data, formula = formula, weights=data$.weights)
  }
  if (length(cluster) > 1) {
    v1 <- cluster
  }
  else {
    v1 <- data[, cluster]
  }
  dfr <- data.frame(cluster = v1)
  vcov2 <- multiwayvcov::cluster.vcov(model = mod, cluster = dfr)
  res <- list(lm_res = mod, vcov = vcov2)
  class(res) <- "lm.cluster"
  return(res)
}

答案 1 :(得分:1)

这与CRAN上的estimatr包和estimatr::lm_robust()函数一起很好地工作。有两个注意事项:(1)您可以使用se_type =更改标准错误的类型,以及(2)我将idschool保留在数据中,因为我们希望群集与{我们适合模型。

data.frame