我需要在使用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可以与负下标混合。
有人可以指出我的代码出错吗?
答案 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]
}
您的代码中存在四个问题:
alphas(j)
更改为alphas[j]
。French[,d1]+French[,d4]+French[,d6]+French[,d10]
添加对应列中的值。如果要选择列的子集,可以使用French[c("d1", "d4", "d6", "d10")]
French[,"rmrf"]
。seq
。它返回从1到列数的序列。as.real
。返回的系数是实数。生成包含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
。