0

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

runpanels 函数首先调用准备数据函数,该函数创建在函数中指定为参数的结果变量的滞后变量和差异变量。所以在preparedata之后,模型数据包含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(expr,envir,enclos)中的错误:找不到对象'loutcomevar'调用:eval(e,x,parent.frame())

所以它没有找到我在运行面板函数环境中的准备数据函数中创建的滞后变量。

我怎样才能调用这些变量?

下面来自另一个问题的示例解决方案是使用与我的问题类似的调用,但我也想调用作为函数参数的结果变量的转换。任何如何解决这个问题的想法将不胜感激!

来自其他类似问题的示例解决方案:air <- data(airquality) fm <- lm(Ozone ~ Solar.R, data=airquality)

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

2 回答 2

1

您假设 R 解释器的容量太大,无法像您一样思考。它的抽象能力要有限得多。特别是,没有任何解释允许在公式或子集调用中构造 doutcomevar nd 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)
     }
于 2014-07-05T18:37:18.097 回答
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")
于 2014-07-05T23:37:13.060 回答