Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用R中公式中的变量转换_R_Get_Call_Data.table_Lexical Scope - Fatal编程技术网

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

如何使用R中公式中的变量转换,r,get,call,data.table,lexical-scope,R,Get,Call,Data.table,Lexical Scope,我试图在一个函数中使用outcomevar的转换,该函数运行一些模型变体,并将结果存储在一个列表中 runpanelsfunction首先调用prepare data函数,该函数创建函数中指定为参数的结果变量的滞后变量和差分变量。因此,在准备数据之后,模型数据包含outcomevar、doutcomevar和loutcomevar 我的问题是,我现在需要调用/获取outcomevar的这些转换,以将数据子集,从而使loutcomevar和doutcomevar不为零。 然后我需要在模型中使用do

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

runpanelsfunction首先调用prepare data函数,该函数创建函数中指定为参数的结果变量的滞后变量和差分变量。因此,在准备数据之后,模型数据包含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")
set.seed(1)

df您假设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)
     }
runpanels
set.seed(1)

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