0

我最近尝试将我所有的函数组织在包中,以避免在每个脚本之上有数百行代码。在运行一组 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 build 的系统调用以旧方式生成包,并使用 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]]))”时收到错误消息“错误:$ 运算符对原子向量无效”。我的包中的所有其他功能都可以正常工作,所以我想这不是我创建包的方式的一般问题。有没有人遇到过这种类型的问题?关于如何成功使用 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)
4

1 回答 1

2

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

Imports: lme4

到你的包DESCRIPTION文件,和

import(lme4)

到你的包 NAMESPACE 文件。更谨慎的做法是枚举所有依赖项,如编写 R 扩展中所述。

嗯,您正在使用 roxygen2;而且我不确定如何在这种情况下适当地指定导入。

于 2013-06-21T01:26:35.673 回答