使用R测试投资组合上的alpha和beta

时间:2013-12-21 14:07:42

标签: r regression alpha

我需要在使用R的少数投资组合的单因子模型上测试alpha和beta。我认为这是一个问题,我需要测试我的回归系数是否为零。我使用我在RStudio上传的名为“法语”的数据。 d1,d4,d6和d10是我想要测试的投资组合,而rmrf是我使用的市场代理。

betas <- NULL
alphas <- NULL
for(j in French[,d1]+French[,d4]+French[,d6]+French[,d10]){
  m <- lm(French[,j]~French[,rmrf])
  betas(j) <- as.real(m$coefficients[2])
  alphas(j) <- as.real(m$coefficients[1])
}

在此之后,我打算对alphas和beta进行t检验。但是我收到以下消息:

  

.subset(x,j)中的错误:只有0可以与负下标混合。

有人可以指出我的代码出错吗?

2 个答案:

答案 0 :(得分:0)

您应该使用此更正的代码:

betas <- NULL
alphas <- NULL
dat <- French[c("d1", "d4", "d6", "d10")] # a subset for the loop
for(j in seq(dat)) {
  m <- lm(dat[[j]] ~ French[,"rmrf"])
  betas[j] <- m$coefficients[2]
  alphas[j] <- m$coefficients[1]
}

您的代码中存在四个问题:

  1. R中的索引使用方括号。我将alphas(j)更改为alphas[j]
  2. 命令French[,d1]+French[,d4]+French[,d6]+French[,d10]添加对应列中的值。如果要选择列的子集,可以使用French[c("d1", "d4", "d6", "d10")]
  3. 要按名称访问列,您必须提供名称作为字符串,例如French[,"rmrf"]
  4. 我在数据框的子集周围添加了seq。它返回从1到列数的序列。
  5. 没有功能as.real。返回的系数是实数。

  6. 生成包含alpha和β系数的数据框的简便方法是

    setNames(as.data.frame(do.call(rbind, lapply(French[c("d1", "d4", "d6", "d10")],
      function(x) coef(lm(French[[1]] ~ x))))), c("alpha", "beta"))
    

    返回数据框的行名与输入数据框的列名相对应。

答案 1 :(得分:0)

这里有很多问题。 @Sven已经解决了其中一些问题。您获得的子集错误是因为您尝试使用j作为数组的索引,但j不是索引,而是实际数据。

这应该有效:

betas<-c()
alphas<-c()
for(j in c("d1","d4","d6","d10")){
  m <- lm(French[,j] ~ French[,"rmrf"])
  betas<-c(betas,m$coefficients[2])
  alphas<-c(alphas,m$coefficients[1])
}

顺便说一下,对你的alphas和beta进行t检验可能不是判断它们是否具有统计学意义的最好方法。例如,对alpha数组进行t检验将测试这些alphas是否与0显着不同,但它不会告诉你任何个体投资组合的alpha是否具有统计显着性。另一个可能更好的选择是单独测试每个回归系数的显着性。例如,此代码将为您提供每个回归的alpha和beta系数的T统计量。

betaT<-c()
alphaT<-c()
for(j in c("d1","d4","d6","d10")){
  m <- lm(French[,j] ~ French[,"rmrf"])
  betaT<-c(betaT,summary(m)$coefficients[2,3])
  alphaT<-c(alphaT,summary(m)$coefficients[1,3])
}

有关详情和更多信息,请参阅?summary.lm