2014-07-05 30 views
0

我試圖在運行幾個模型變體並將結果存儲在列表中的函數中使用我的outcomevar轉換。如何在R中使用公式中的變量轉換

runpanels函數首先調用prepare數據函數,該函數創建函數中指定爲參數的結果變量的滯後和差異變量。因此,在prepareata之後,模型數據包含outcomevar,doutcomevar和loutcomevar。

我的問題是我現在需要調用/獲得結果變量的這些轉換的子集的數據,使得loutcomevar和doutcomevar不爲零。 然後我需要在模型中使用doutcomevar和loutcomevar。

 set.seed(1) 
    df <- data.frame(firm=rep(LETTERS[1:5],each=10), 
      date=as.Date("2014-01-01")+1:10, 
      y1=sample(1:100,50),y2=sample(1:100,50),y3=sample(1:100,50), 
      x1=sample(1:100,50), x2=sample(1:100,50)) 

    preparedata<-function(testData,outcomevar){ 
    require(data.table) 
    DT <- as.data.table(testData) 
    setkey(DT,firm,date) 
    DT[,lag := c(NA,unlist(.SD)[-.N]), by=firm, .SDcols=outcomevar] 
    DT[,diff := c(NA,diff(unlist(.SD))), by=firm, .SDcols=outcomevar] 
    setnames(DT,c("lag","diff"),paste0(c("loutcomevar","doutcomevar"))) 
    return(DT) 
    modeldata<-as.data.frame(DT) 
    } 


    runpanels <- function(testData,outcomevar) { 
    modeldata<-preparedata(testData,outcomevar) 
    modeldata<-subset(modeldata,loutcomevar!=0& doutcomevar!=0) 
    modellist<-list() 
    modellist$m1<-lm(log(outcomevar)~-1+x1+x2,data=modeldata) 
    modellist$m2<-lm(log(doutcomevar)~-1+x1+date,data=modeldata) 
    modellist$m3<-lm(log(outcomevar)~-1+log(loutcomevar)+x1+x2,data=modeldata) 
    return(modellist) 
    } 
    Example use: modelsID1<-runpanels(df,outcomevar="y1") 

不出所料,我得到的錯誤,當它到達評估 「loutcomevar!= 0」:錯誤的eval(表達式,ENVIR,enclos): 'loutcomevar' 未找到 從調用對象:EVAL(E ,x,parent.frame())

因此,它找不到在運行面板函數環境中的準備數據函數中創建的滯後變量。

我該如何調用這些變量?

以下來自另一個問題的示例解決方案是使用與我的問題類似的調用,但我也想調用我的outcomevar的變換,它是函數的參數。 任何想法如何解決這個將非常感謝!數據(airquality) FM < - - LM(臭氧〜Solar.R,數據= airquality)

myfun <- function(fm, name){ 
dn <- fm$call[['data']] 
varname <- deparse(substitute(name)) 
get(as.character(dn),envir=.GlobalEnv)[varname] 
} 
Usage: myfun(fm, Temp) 
+0

你在哪裏定義loutcomevar和doutcomevar? (他們從來都不是真正的可變字符值。)如果你用df和「y1」運行'preparedata',你會得到'dy1'和'ly1',而不是你在'subset'內部拋出錯誤的名字。請仔細閱讀「子集」幫助頁面。它特別警告您在使用函數時會遇到困難。 –

+0

是的,這是問題所在。我不知道如何定義它們,使其運行。 – TinaW

+0

我提供了一個可能的起點。這實際上是兩個不同的問題:一個是關於使用'[['或'['的子集化,另一個關於buildng公式的問題。 SO中有很多關於構建公式對象的工作示例。 –

回答

1

您正在承擔方式 空氣<:從其它問題,這是一種類似於

實施例的解決方案R翻譯的能力太大,像你一樣思考。它的抽象能力更加有限。特別是沒有任何解釋允許在公式或子集調用中構建doutcomevar和loutcomevar。

東西allong這些(未經測試)行可能的工作:

runpanels <- function(testData,outcomevar) { 
    modeldata<-preparedata(testData,outcomevar) 
    idx <- testData[[ paste0("l", outcomevar) ]] != 0 & 
      testData[[ paste0("d", outcomevar) ]] != 0 
    modeldata<-modeldata[idx ,] 
    modellist<-list() 
    form1 <- as.formula("log(", outcomevar,")~-1+x1+x2") 
    modellist$m1<-lm(log(outcomevar)~-1+x1+x2,data=modeldata) 
     #similar construction of formula objects for models 2 and 3 
     # ......... 
    modellist$m2<-lm(log(doutcomevar)~-1+x1+date,data=modeldata) 
    modellist$m3<-lm(log(outcomevar)~-1+log(loutcomevar)+x1+x2,data=modeldata) 
    return(modellist) 
    } 
0
 set.seed(1) 
df <- data.frame(firm=rep(LETTERS[1:5],each=10), 
     date=as.Date("2014-01-01")+1:10, 
     y1=sample(1:100,50),y2=sample(1:100,50),y3=sample(1:100,50), 
     x1=sample(1:100,50), x2=sample(1:100,50)) 

     preparedata<-function(testData,outcomevar){ 
     require(data.table) 
     DT <- as.data.table(testData) 
     setkey(DT,firm,date) 
     DT[,lag := c(NA,unlist(.SD)[-.N]), by=firm, .SDcols=outcomevar] 
     DT[,diff := c(NA,diff(unlist(.SD))), by=firm, .SDcols=outcomevar] 
     setnames(DT,c("lag","diff"),paste0(c("loutcomevar","doutcomevar"))) 
     DT$outcomevar <- with(DT, eval(parse(text=outcomevar))) 
     return(DT) 
     modeldata<-as.data.frame(DT) 
     } 
     runpanels <- function(testData,outcomevar) { 
     modeldata<-preparedata(testData,outcomevar) 
     modeldata<-subset(modeldata,loutcomevar!=0& doutcomevar!=0) 
     modellist<-list() 
     modellist$m1<-lm(log(outcomevar)~-1+x1+x2,data=modeldata) 
     modellist$m2<-lm(log(doutcomevar)~-1+x1+date,data=modeldata) 
     modellist$m3<-lm(log(outcomevar)~-1+log(loutcomevar)+x1+x2,data=modeldata) 
     return(modellist) 
     } 
Example use: modelsID1<-runpanels(df,outcomevar="y1") 
Example use: modelsID1<-runpanels(df,outcomevar="y2")