簡體   English   中英

在來自小鼠(R)的部分估算數據上運行glm.mids

[英]Run glm.mids on a subset of imputed data from mice (R)

我得到一個錯誤,當我嘗試運行glm.mids上的一個子集mids歸集對象:

library(mice)
imp2 = mice(nhanes)
glm.mids( (hyp==2)~bmi+chl, data=imp2, subset=(age==1) )

給出錯誤的錯誤信息

"Error in eval(expr, envir, enclos) :
..1 used in an incorrect context, no ... to look in"

即使語法可以在原始數據集上使用常規glm進行操作:

glm( (hyp==2)~bmi+chl, data=nhanes, subset=(age==1) )

文檔?glm.mids並未專門解決subset但說您可以將其他參數傳遞給glm 如果我不能在glm.mids使用subset ,是否有一個很好的方法直接將mids列表對象子集?

我已經擁有重寫glm.mids的自由。 這有點糊塗。 問題似乎源於將屬性傳遞給glm的隱式本質。

另請參閱以下帖子:

https://stat.ethz.ch/pipermail/r-help/2003-November/041537.html

http://r.789695.n4.nabble.com/Question-on-passing-the-subset-argument-to-an-lm-wrapper-td3009725.html

library(mice)

glm.mids=function (formula, family = gaussian, data, ...) 
{
  call <- match.call()
  if (!is.mids(data)) 
    stop("The data must have class mids")
  analyses <- as.list(1:data$m)
  for (i in 1:data$m) {
    data.i <- complete(data, i)
    analyses[[i]] <- do.call("glm",list(formula=quote(formula),family=quote(family),data=quote(data.i),...))
  }
  object <- list(call = call, call1 = data$call, nmis = data$nmis, 
                 analyses = analyses)
  oldClass(object) <- c("mira", "glm", "lm")
 return(object)
}

imp2 = mice(nhanes)
glm.mids( (hyp==2)~bmi+chl, data=imp2 ,subset=quote(age==1))

我重寫的唯一部分是glm.mids analyses[[i]] <- do.call("glm",list(formula=quote(formula),family=quote(family),data=quote(data.i),...)) -do.call analyses[[i]] <- do.call("glm",list(formula=quote(formula),family=quote(family),data=quote(data.i),...))

在舊版本中,它讀取analyses[[i]] <- glm(formula, family = family, data = data.i,...)

解決辦法是用

with(data=imp2, exp=glm((hyp==2)~bmi+chl, family=binomial , subset=(age==1) ))


(我認為)您問題中的問題是在glm.mids函數中使用... 它們在函數參數中使用,以允許“將其他參數傳遞給glm”。 但是,當在glm.mids函數glm.mids ...傳遞給glm調用時,不會以這種方式處理它們。 ?glm...是“對於glm:如果未直接提供,則用於形成默認控制參數的參數”。 因此,其他參數將不起作用。

要看到這一點,簡化功能

f1 <- function (formula, family = binomial, data, ...) 
{
 glm(formula, family = family, data = data, ...)
  }

f1(formula=((hyp==2)~bmi+chl), data=nhanes, subset=(age==2)) 
#Error in eval(expr, envir, enclos) : 
#  ..1 used in an incorrect context, no ... to look in

因此子集參數不會傳遞給glm函數調用

使用R的答案:在R函數內部將參數傳遞給glm,我們可以稍微更改一下函數

f2 <- function (formula, family = binomial, data, ...) 
{
  eval(substitute(glm(formula, family = family, data = data, ...)))
}

# This now runs
f2(formula=((hyp==2)~bmi+chl), data=nhanes, subset=(age==2))

# check
glm((hyp==2)~bmi+chl, data=nhanes, family="binomial", subset=(age==2))

使用substitute將替換函數環境中的參數(這需要更多詳細信息-請隨時更新)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM