2013-06-21 27 views
0

我最近試圖將所有函數組織到包中,以避免在每個腳本的頂部有數百行代碼。我編寫了一系列運行LME4多級模型後使用的函數。這些函數被設計用來生成漂亮的輸出表(我知道有些可用的包可以做到這一點,但它們通常不夠靈活,無法根據我的需要自定義表)。下面是一個函數的例子,它採用lmer模型的列表(例如,fm0,fm1,fm2),並將固定效果參數和它們各自的標準錯誤組合到一個輸出表格中(稍後我將其與其他模型統計信息一起使用生成定製的迴歸表)。在源碼包中使用S4對象輸出

#' @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]]))」時,出現錯誤消息「錯誤:$運算符對原子向量無效」。 我的軟件包中的所有其他功能都正常工作,所以我想這不是我創建軟件包的方式的一般問題。有沒有人遇到過這種類型的問題?有沒有關於如何成功使用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

你能添加一個你的函數輸入的例子嗎?我用'fm1 < - lmList(distance〜age | Subject,Orthodont)'測試它,但它給了我錯誤。 – agstudy

回答

2

我認爲你在尋找進口依賴到你的包名稱空間,這樣做是的廉價的方式

Imports: lme4 

添加到您的軟件包說明文件,和

import(lme4) 

到你的包NAMESPACE文件。這樣做更謹慎的方法是枚舉所有的依賴關係,如Writing R Extensions中所述。

嗯,你正在使用roxygen2;而且我不確定如何在該上下文中適當地指定導入。

+0

免責聲明:我對包裝知之甚少(尚未)。只需在函數內添加'需要(lme4)'工作? –

+0

是的,但名稱空間更好,因爲它可以確保找到預期的函數(將require(lme4)'添加到'search()'路徑中,所以有人(你)可以前來添加函數這掩蓋了lme4中的預期功能)。 –

+0

嗨馬丁摩根, 非常感謝這非常有用的信息/建議!我遵循你的建議,並將lme4添加到DESCRIPTION和NAMESPACE文件中,它完美地工作!在roxygen2中,向NAMESPACE添加任何內容都非常簡單:只需在特定函數的頂部添加「#'@import lme4」,它就會自動寫入NAMESPACE。 – Raphael