我最近试图在包中组织我的所有功能,以避免在每个脚本之上有数百行代码。在运行一组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)
答案 0 :(得分:2)
我认为您正在寻找将依赖项导入您的包名称空间,这样做的便宜方式是添加
Imports: lme4
到您的包描述文件和
import(lme4)
到你的包NAMESPACE文件。更谨慎的做法是按照Writing R Extensions中的描述枚举所有依赖项。
嗯,你正在使用roxygen2;并且我不确定如何在该上下文中适当地指定导入。