如何使用R中公式中的变量转换
我试图在一个函数中使用outcomevar的转换,该函数运行一些模型变体,并将结果存储在一个列表中 runpanelsfunction首先调用prepare data函数,该函数创建函数中指定为参数的结果变量的滞后变量和差分变量。因此,在准备数据之后,模型数据包含outcomevar、doutcomevar和loutcomevar 我的问题是,我现在需要调用/获取outcomevar的这些转换,以将数据子集,从而使loutcomevar和doutcomevar不为零。 然后我需要在模型中使用doutcomevar和loutcomevar如何使用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
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)
}
runpanelsset.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")