在源包中使用S4对象输出

时间:2013-06-21 01:02:38

标签: r s4 lme4

我最近试图在包中组织我的所有功能,以避免在每个脚本之上有数百行代码。在运行一组LME4多级模型后,我编写了许多函数。这些函数用于生成不错的输出表(我知道有可用的包可以执行此操作,但这些通常不够灵活,无法根据我的需要自定义表)。下面是一个函数的示例,该函数采用lmer模型列表(例如,fm0,fm1,fm2),并将固定效果参数及其各自的标准错误组合在一个输出表中(我稍后将与其他模型统计信息一起使用)生成定制的回归表)。

#' @rdname f.regTableFix1
#' @title Fixed effects table for lmer models
#' @description This function produces a regression table for multiple models of type lmer (lme4).
#' @param mList list of models to be used for the table
#' @return The output contains fixed effects (b,Std.Error) parameter.
#' @export
#' 
f.regTableFix1=function(mList){
  # Obtain fixed effects parameter
  for(m in 1:length(mList)){
    #m=2
    # Declare variables
    fix=fixef(mList[[m]]) #obtains fixed effect estimates
    stder=sqrt(diag(vcov(mList[[m]]))) #obtains respective standard errors
    if(m==1){
      masterFix=data.frame(variables=as.character(names(fix)),b=fix,se=stder,row.names=NULL,stringsAsFactors=F)
      names(masterFix)[!names(masterFix)=="variables"]=paste(names(masterFix)[!names(masterFix)=="variables"],m,sep=".")
    }else{
      addFix=data.frame(variables=as.character(names(fix)),b=fix,se=stder,row.names=NULL,stringsAsFactors=F)
      names(addFix)[!names(addFix)=="variables"]=paste(names(addFix)[!names(addFix)=="variables"],m,sep=".")
      masterFix=merge(masterFix,addFix,by="variables",all=T,sort=F)
    }
  }
  return(masterFix)
}

如果我只是在我的脚本中使用该函数(在顶部定义),它可以正常工作。但是,在我将函数包含在包中之后,它会抛出以下错误(我通过使用对R CMD构建的系统调用以旧方式生成包并使用R CMD INSTALL安装包。)

> tableFix=f.regTableFix1(modList)
Error in as.integer(x) : 
  cannot coerce type 'S4' to vector of type 'integer'

这个错误似乎与我在函数中使用S4对象有某种联系。不幸的是,固定效果参数和标准误差来自lmer模型(S4对象),我无法改变这一点。我尝试了多种获取固定效果参数和标准误差的方法,包括:

coef(summary(mList[[m]]))
summary(mList[[m]])@coefs

使用这些不同的规范,如果我在我的脚本顶部声明的函数中使用它们都可以正常工作,但如果我将函数放入包中,它们都不起作用。只有错误消息更改。例如,当使用“coef(summary(mList [[m]]))”时,我收到错误消息“错误:$ operator对原子向量无效”。 我的包中的所有其他功能都可以正常工作,所以我想这不是我创建包的方式的一般问题。以前有没有人遇到过这类问题?有没有关于如何成功使用S4对象作为包中函数输入的建议?非常感谢任何帮助/建议/评论!

最佳, 圣拉斐尔

编辑: 很抱歉,首先不提供一些示例数据。但现在是:

library(lme4)

# Prepare some example data
edata=Dyestuff #data automatically available through lme4
edata$var1=rnorm(30)
edata$var2=rnorm(30)
edata$var3=rnorm(30)

# Run multilevel models
fm0=lmer(Yield~1+(1|Batch), data=edata,
         na.action=na.omit, family="gaussian", verbose=F)

fm1=lmer(Yield~1+var1+(1|Batch), data=edata,
         na.action=na.omit, family="gaussian", verbose=F)

fm2=lmer(Yield~1+var1+var2+var3+(1|Batch), data=edata,
         na.action=na.omit, family="gaussian", verbose=F)

# Store model outputs in list
modList=list(fm0, fm1, fm2) 

# Obtain fixed effects output table with above discussed function
fixTable=f.regTableFix1(modList)

1 个答案:

答案 0 :(得分:2)

我认为您正在寻找将依赖项导入您的包名称空间,这样做的便宜方式是添加

Imports: lme4

到您的包描述文件和

import(lme4)

到你的包NAMESPACE文件。更谨慎的做法是按照Writing R Extensions中的描述枚举所有依赖项。

嗯,你正在使用roxygen2;并且我不确定如何在该上下文中适当地指定导入。