【问题标题】:How to use transformations to variables in formulas in R如何在R中的公式中使用对变量的转换
【发布时间】:2014-08-26 16:02:30
【问题描述】:

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

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

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

如何调用这些变量?

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

其他类似问题的示例解决方案: 空气

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

【问题讨论】:

  • 你在哪里定义 loutcomevar 和 doutcomevar? (它们从来都不是真正的变量字符值。)如果你用 df 和“y1”运行preparedata,你会得到'dy1'和'ly1',而不是你在subset 中抛出错误的名称。更仔细地阅读subset 帮助页面。它特别警告您在函数内使用时会遇到困难。
  • 是的,这就是问题所在。我不知道如何定义它们以便运行。
  • 我提供了一个可能的起点。这实际上是两个独立的问题:一个是关于使用[[[ 进行子集化,另一个是关于构建公式。 SO中有很多关于构建公式对象的工作示例。
  • 谢谢!你给了我一个想法。我在 set names 函数中更新了上面的定义,以将其一般定义为“loutcome”和 d“outcome”。现在我在运行第一个模型时遇到错误,因为它没有找到变量“outcomevar”。所以我需要创建一个新的变量,它是=指定为参数的结果变量,然后我猜它应该可以工作。这不会使用原始名称。而是用正确的名称替换占位符结果变量。
  • preparedata

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


【解决方案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)
     }

【讨论】:

    【解决方案2】:
           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")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-28
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 2013-10-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多