2

我需要使用 R 的“PerformanceAnalytics”包并使用这个包,它需要我将数据转换为 xts 数据。可以从此链接下载数据:https ://drive.google.com/file/d/0B8usDJAPeV85elBmWXFwaXB4WUE/edit?usp=sharing 。因此,我使用以下命令创建了 xts 数据:

data<-read.csv('monthly.csv')
dataxts <- xts(data[,-1],order.by=as.Date(data$datadate,format="%d/%m/%Y"))

但是这样做之后,它会丢失面板数据结构。我试图对xts数据进行排序以使其恢复为面板数据形式,但失败了。

谁能帮我重新组织xts数据,使其看起来像面板数据。我需要按公司 ID(gvkey)和数据(datadate)对它们进行排序。

4

2 回答 2

2

xts 对象仅按时间索引排序。它们不能按其他任何东西排序。

我鼓励您将 data.frame 拆分为一个列表,按gvkey. 然后将每个列表元素转换为 xts 并删除不随时间变化的列,将它们存储为xtsAttributes. 您可能还想考虑使用yearmon该类,因为您正在处理月度数据。

您必须确定如何编码非数字的时变值,因为您不能在 xts 对象中混合类型。

Data <- read.csv('monthly.csv', nrow=1000, as.is=TRUE)
DataList <- split(Data, Data$gvkey)
xtsList <- lapply(DataList, function(x) {
  attrCol <- c("iid","tic","cusip","conm","exchg","secstat","tpci",
    "cik","fic","conml","costat","idbflag","dldte")
  numCol <- c("ajexm","ajpm","cshtrm","prccm","prchm","prclm",
    "trfm", "trt1m", "rawpm", "rawxm", "cmth", "cshom", "cyear")
  toEncode <- c("isalrt","curcdm")
  y <- xts(x[,numCol], as.Date(x$datadate,format="%d/%m/%Y"))
  xtsAttributes(y) <- as.list(x[1,attrCol])
  y
})

每个列表元素现在都是一个 xts 对象,并且更加紧凑,因为您不会重复完全冗余的数据。您可以轻松地对每个gvkeyvialapply和朋友进行分析。

> str(xtsList[["1004"]])
An ‘xts’ object on 1983-01-31/2012-12-31 containing:
  Data: num [1:360, 1:13] 3.38 3.38 3.38 3.38 3.38 ...
 - attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ : chr [1:13] "ajexm" "ajpm" "cshtrm" "prccm" ...
  Indexed by objects of class: [Date] TZ: UTC
  xts Attributes:  
List of 13
 $ iid    : int 1
 $ tic    : chr "AIR"
 $ cusip  : int 361105
 $ conm   : chr "AAR CORP"
 $ exchg  : int 11
 $ secstat: chr "A"
 $ tpci   : chr "0"
 $ cik    : int 1750
 $ fic    : chr "USA"
 $ conml  : chr "AAR Corp"
 $ costat : chr "A"
 $ idbflag: chr "D"
 $ dldte  : chr ""

您可以通过以下方式访问属性xtsAttributes

> xtsAttributes(xtsList[["1004"]])$fic
[1] "USA"
> xtsAttributes(xtsList[["1004"]])$tic
[1] "AIR"
于 2014-01-28T00:34:58.427 回答
0

实现此目标的一种有效方法是使用“reshape2”包将面板数据(长格式)转换为宽格式。执行估计后,将其转换回长格式或面板数据格式。这是一个例子:

library(foreign)
library(reshape2)
dd <- read.dta("DDA.dta") // DDA.dta is Stata data; keep only date, id and variable of interest (i.e. three columns in total)
wdd<-dcast(dd, datadate~gvkey) // gvkey is the id
require(PerformanceAnalytics)
wddxts <- xts(wdd[,-1],order.by=as.Date(wdd$datadate,format= "%Y-%m-%d"))

ssd60A<-rollapply(wddxts,width=60,SemiDeviation,by.column=TRUE,fill=NA) // e.g of rolling window calculation
ssd60A.df<-as.data.frame(ssd60A.xts) // convert dataframe to xts
ssd60A.df$datadate=rownames(ssd60A.df) // insert time index
lssd60A.df<-melt(ssd60A.df, id.vars=c('datadate'),var='gvkey') // convert back to panel format
write.dta(lssd60A.df,"ssd60A.dta",convert.factors = "string") // export as Stata file

然后简单地将其与主数据库合并以执行一些回归。

于 2014-08-25T23:14:00.063 回答