我正在尝试在运行一些模型变体的函数中使用我的outcomevar的变换,并将结果存储在列表中。
runpanelsfunction首先调用prepare数据函数,该函数创建在函数中指定为参数的结果变量的滞后和差异变量。因此,在preparedata之后,模型数据包含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")
不出所料,我在评估“loutcomevar!= 0”时收到错误 :eval(expr,envir,enclos)中的错误:找不到对象'loutcomevar' 来自:eval(e,x,parent.frame())
因此它没有找到我在运行面板功能环境中的prepare数据函数中创建的滞后变量。
如何调用这些变量?
以下另一个问题的示例解决方案是使用类似于我的问题的调用,但我也想调用我的outcomevar的变换,这是函数的一个参数。 任何想法如何解决这个问题将非常感激!
来自其他问题的示例解决方案有点类似: 空气&lt; - 数据(空气质量) fm&lt; - lm(臭氧~Solar.R,数据=空气质量)
myfun <- function(fm, name){
dn <- fm$call[['data']]
varname <- deparse(substitute(name))
get(as.character(dn),envir=.GlobalEnv)[varname]
}
Usage: myfun(fm, Temp)
答案 0 :(得分: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)
}
答案 1 :(得分: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")