结果变量作为回归函数的参数

时间:2014-07-04 13:57:54

标签: r function arguments dplyr

我有一个数据集功能,目前有2个参数:testData和ID1。我想将结果变量作为参数包含在内。

假设outcomevar = c(y1,y2,y3)那么函数应该创建我的结果变量的滞后和差异变量。

preparedata<-function(testData,ID1,outcomevar){
#Order temp data by firm and date
            testData <- testData[order(testData$firm,testData$date),]
#Create lagged outcomevar for each firm
            testData <- ddply(testData, .(firm), transform,
            ly1 = c( NA, y1[-length(y1)] ) )
#Create differenced variable
            testData$dy1<-(testData$y1-testData$ly1)
}

其中&#34; l&#34;和&#34; d&#34;在y1前面代表滞后和差异。 取决于如何包含结果变量? 谢谢 Ť

3 个答案:

答案 0 :(得分:1)

以下是使用数据表的解决方案:

# create sample dataset
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))


preparedata<-function(testData,ID1,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("l","d"),outcomevar))
  return(DT)
}

result <- preparedata(df,1,outcomevar="y1")
head(result)
#    firm       date y1 y2 y3 ly1 dy1
# 1:    A 2014-01-02 27 48 66  NA  NA
# 2:    A 2014-01-03 37 86 35  27  10
# 3:    A 2014-01-04 57 43 27  37  20
# 4:    A 2014-01-05 89 24 97  57  32
# 5:    A 2014-01-06 20  7 61  89 -69
# 6:    A 2014-01-07 86 10 21  20  66

这假设您传递包含&#34; outcomevar&#34;的列的名称,而不是列本身。

您应该阅读有关数据表(?data.table)的文档,但简而言之,此代码将输入数据框转换为数据表,对数据表进行排序(使用setkey(...)),并添加两个参考新列:lagdiff.SD是数据表框架中的一个特殊变量,它是&#34;包含by=...&#34;中指定的行的原始DT的子集的别名。您可以使用.SDcols=...指定要包含的列。 diff(...)函数计算滞后差异,这与您正在进行的操作相同。最后,我们将列lagdiff重命名为,例如ly1dy1

答案 1 :(得分:0)

以下是一个功能概述,它更依赖于您的示例:

 preparedata<-function(testData,outcomevar){
   require(plyr)
   testData <- testData[order(testData$firm,testData$date),]
   testData$tmp.var <- with(testData, eval(parse(text=outcomevar)))
   testData <- ddply(testData, .(firm), transform, 
                     lvar = c( NA, tmp.var[-length(tmp.var)]))
   testData$tmp.var <- NULL
   testData <- within(testData, assign(paste("d", outcomevar, sep=""),
                                       testData[,outcomevar]-testData$lvar))
   colnames(testData)[grep("lvar", colnames(testData))] <- paste("l", outcomevar, sep="")
   return(testData)
 }

使用jihoward答案中定义的df,我们得到

 > head(preparedata(df,"y1"))

   firm       date y1 y2 y3 lvar dy1
 1    A 2014-01-02 27 48 66   NA  NA
 2    A 2014-01-03 37 86 35   27  10
 3    A 2014-01-04 57 43 27   37  20
 4    A 2014-01-05 89 24 97   57  32
 5    A 2014-01-06 20  7 61   89 -69
 6    A 2014-01-07 86 10 21   20  66

此函数返回一个数据框,其中ly1是滞后变量,dy1是使用第二个参数outcomevar指定的差异变量。请注意,在此函数中,您将名称(即字符)传递给该函数。也就是说,在调用函数时不要写y1,而要写"y1"

答案 2 :(得分:0)

您可以先将所有结果变量收集到一个键值列对中,同时处理所有结果变量:

set.seed(1)
df <- data.frame(
  firm = rep(LETTERS[1:5], each = 10),
  date = as.Date("2014-01-01") + 1:10,
  y1 = sample(100, 50),
  y2 = sample(100, 50),
  y3 = sample(100, 50)
)

library(dplyr)
library(tidyr)
df %>%
  gather(key, value, y1:y3) %>%
  group_by(firm, key) %>%
  mutate(lag = lag(value), diff = lag - value)
#> Source: local data frame [150 x 6]
#> Groups: firm, key
#> 
#>    firm       date key value lag diff
#> 1     A 2014-01-02  y1    27  NA   NA
#> 2     A 2014-01-03  y1    37  27  -10
#> 3     A 2014-01-04  y1    57  37  -20
#> 4     A 2014-01-05  y1    89  57  -32
#> 5     A 2014-01-06  y1    20  89   69
#> 6     A 2014-01-07  y1    86  20  -66
#> 7     A 2014-01-08  y1    97  86  -11
#> 8     A 2014-01-09  y1    62  97   35
#> 9     A 2014-01-10  y1    58  62    4
#> 10    A 2014-01-11  y1     6  58   52
#> ..  ...        ... ...   ... ...  ...