【发布时间】: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