在过去的几天里,我一直在尝试如何在R中进行Fama Macbeth回归。建议将plm软件包与pmg一起使用,但是我所做的每一次尝试都使我发现我的时间段数量不足
我的数据集包含2828419个观测值,其中包含13列变量,我希望这些变量可以进行多次横截面回归。 我的公司由seriesis指定,我有一个可变的日期,并且想要进行以下Fama Macbeth回归:
totret ~ size
totret ~ momentum
totret ~ reversal
totret ~ volatility
totret ~ value size
totret ~ value + size + momentum
totret ~ value + size + momentum + reversal + volatility
我一直在使用以下命令:
fpmg <- pmg(totret ~ momentum, Data, index = c("date", "seriesid")
哪个返回:Error in pmg(totret ~ mom, Dataset, index = c("seriesid", "datem")) :
Insufficient number of time periods
我尝试使用数据集为datatable,dataframe和pdataframe的方法。切换索引效果不佳。
我的数据也包含NA。
谁可以解决这个问题,或者为我找到其他方法来做Fama Macbeth?
答案 0 :(得分:1)
最近,我修复了R中的Fama Macbeth回归。 从具有行中所有特征的数据表中,以下工作并为均等加权或对回归应用权重提供了机会(对于同等权重,删除“,weights = marketcap”)。 totret是总收益变量,logmarket是市值的对数。
logmarket<- df %>%
group_by(date) %>%
summarise(constant = summary(lm(totret~logmarket, weights = marketcap))$coefficient[1], rsquared = summary(lm(totret~logmarket*, weights = marketcap*))$r.squared, beta= summary(lm(totret~logmarket, weights = marketcap))$coefficient[2])
您将获得一个包含每月alpha(常数),beta(beta)和R平方(rsquared)的DataFrame。
要在数据框中检索具有t统计量的系数:
Summarystatistics <- as.data.frame(matrix(data=NA, nrow=6, ncol=1)
names(Summarystatistics) <- "logmarket"
row.names(Summarystatistics) <- c("constant","t-stat", "beta", "tstat", "R^2", "observations")
Summarystatistics[1,1] <- mean(logmarket$constant)
Summarystatistics[2,1] <- coeftest(lm(logmarket$constant~1))[1,3]
Summarystatistics[3,1] <- mean(logmarket$beta)
Summarystatistics[4,1] <- coeftest(lm(logmarket$beta~1))[1,3]
Summarystatistics[5,1] <- mean(logmarket$rsquared)
Summarystatistics[6,1] <- nrow(subset(df, !is.na(logmarket)))
答案 1 :(得分:0)
这几乎可以肯定是由于公式中的变量中包含NA。该错误消息不是很有帮助-可能不是“估计的时间段太短”的情况,很可能是由于缺少数据而导致的“存在未在所有时间段中表示的公司/单位ID”的情况。放下。
您有两个选择-估算缺失的数据或使用缺失的数据丢弃观察值(后者是在确定要进行估计的有效操作之前对模型进行有效检验而没有缺失点的方法)。
如果数据中的缺失确实是随机的,那么只需丢弃带有缺失的观测值就可以了。否则,您应该估算一下。此处的常用策略是多次估算-至少5次-然后对这5个结果数据集中的每个数据进行估算,并将效果平均在一起。 Amelia
或mice
是非常强大的归因软件包。我喜欢Amelia
,因为一次调用您可以为许多结果数据集估算n
次,并且很容易传递一组变量以不估算(例如,id变量或时间段) idvars
参数。
编辑:我深入研究了源代码,以查看在何处触发了错误以及这是问题所在-再次可能是由于数据丢失而引起的,但它确实与您的自由度相互作用:
...
# part of the code where error is triggered below, here is context:
# X = matrix of the RHS of your model including intercept, so X[,1] is all 1s
# k = number of coefficients used determined by length(coef(plm.model))
# ind = vector of ID values
# so t here is the minimum value from a count of occurrences for each unique ID
t <- min(tapply(X[,1], ind, length))
# then if the minimum number of times a single ID appears across time is
# less than the number of coefficients + 1, you do not have enough time
# points (for that ID/those IDs) to estimate.
if (t < (k + 1))
stop("Insufficient number of time periods")
这就是触发您的错误的原因。因此,估算绝对是一种解决方案,但是数据中可能只有一个罪犯,而且重要的是,一旦满足此条件,您的模型就可以很好地运行 丢失数据。
答案 2 :(得分:0)
有一些“seriesid”条目只有一个条目。因此 pmg 给出了错误。如果你做这样的事情(使用你使用的变量名),它会停止错误:
try2 <- try2 %>%
group_by(cusip) %>%
mutate(flag = (if (length(cusip)==1) {1} else {0})) %>%
ungroup() %>%
filter(flag == 0)