如何使用转换为R中公式中的变量

时间:2014-07-05 18:00:53

标签: r get call data.table lexical-scope

我正在尝试在运行一些模型变体的函数中使用我的outcomevar的变换,并将结果存储在列表中。

runpanelsfunction首先调用prepare数据函数,该函数创建在函数中指定为参数的结果变量的滞后和差异变量。因此,在preparedata之后,模型数据包含outcomevar,doutcomevar和loutcomevar。

我的问题是我现在需要调用/获取outcomevar的这些转换来对数据进行子集化,使得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(expr,envir,enclos)中的错误:找不到对象'loutcomevar' 来自:eval(e,x,parent.frame())

因此它没有找到我在运行面板功能环境中的prepare数据函数中创建的滞后变量。

如何调用这些变量?

以下另一个问题的示例解决方案是使用类似于我的问题的调用,但我也想调用我的outcomevar的变换,这是函数的一个参数。 任何想法如何解决这个问题将非常感激!

来自其他问题的示例解决方案有点类似:      空气&lt; - 数据(空气质量)      fm&lt; - lm(臭氧~Solar.R,数据=空气质量)

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

2 个答案:

答案 0 :(得分:1)

你假设R解释器的容量太大,无法像你一样思考。它的抽象力量更加有限。特别是没有解释允许在公式或子集调用中构造doutcomevar和loutcomevar。

这些(未经测试的)行可能有效:

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)
     }

答案 1 :(得分: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")