2014-07-05 32 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")