我有这样的数据:
Ind_name Co_Name Year EPS BPS
1 A X 2001 10 11
2 A X 2002 12 12
3 A X 2003 15 15
4 A Y 2001 10 18
5 A Y 2002 16 25
6 A Y 2003 20 26
7 B Z 2001 14 36
8 B Z 2002 16 9
9 B Z 2003 20 10同样,在我的数据集中,有50个行业,每个行业有15个公司,每个公司有20年的数据。
我要做的是: 1.过滤特定行业特定年份的所有公司的数据。例如:
Ind_name Co_Name Year EPS BPS
1 A X 2001 10 11
4 A Y 2001 10 18在此之后,我需要计算相关系数,和回归(斜率)β之间的EPS和BPS。
我想要这样的产出:
Ind_name Year Correlation Beta
A 2001 .55 #assume 1.2 #assume
A 2002 .85 #assume 0.2 #assume
A 2003 .65 #assume .65 #assume你能建议我如何做到这一点吗?
注:相关和回归斜率可计算如下:
cor(EPS,BPS) #corrleation
summary(lm(mydata$EPS~mydata$BPS))$coefficients[2] #directly give beta发布于 2016-01-15 12:55:28
我们可以使用data.table
library(data.table)
setDT(df1)[,list(Mean = mean(EPS), Variance = var(EPS)) ,
by = .(Ind_name, Year)]更新
(只是张贴我之前的评论)。我们将“data.frame”转换为“data.table”(setDT(df1)),按“Ind_name”、“年份”分组,根据这些列得到'EPS‘、'BPS’以及coef of lm的cor,然后将'Ind_name‘作为"A“值的子集。
setDT(df1)[, list(Cor=cor(EPS, BPS),
Beta = coef(lm(EPS~BPS))[2]) , by =.(Ind_name, Year)
][Ind_name=="A"]
# Ind_name Year Cor Beta
#1: A 2001 NA 0.0000000
#2: A 2002 1 0.3076923
#3: A 2003 1 0.4545455发布于 2016-01-15 12:25:18
尝试使用dplyr包:
library("dplyr")
df %>%
group_by(Ind_name, Year) %>%
summarise(Mean=mean(EPS),
Median=median(EPS),
Variance=var(EPS))发布于 2016-01-15 13:46:25
一种更完整的基于data.table的方法,通过CJ(c("A", ...), c(2001, ...)实现过滤,只选择相关行业和年份:
library(data.table)
mydata <- fread("Ind_name Co_Name Year EPS BPS
A X 2001 10 11
A X 2002 12 12
A X 2003 15 15
A Y 2001 10 18
A Y 2002 16 25
A Y 2003 20 26
B Z 2001 14 36
B Z 2002 16 9
B Z 2003 20 10")
setkey(mydata, Ind_name, Year)
mydata[
CJ("A", c(2001, 2002, 2003))
, {
list(
Correlation = cor(EPS,BPS)
, Beta = summary(lm(EPS~BPS))$coefficients[2]
)
}
, keyby = .(Ind_name, Year)
]结果如下:
Ind_name Year Correlation Beta
1: A 2001 NA 0.0000000
2: A 2002 1 0.3076923
3: A 2003 1 0.4545455您可以根据需要扩展“函数”(即J参数)的复杂性。
https://stackoverflow.com/questions/34810972
复制相似问题