如何解决‘$ operator is invalid for atomic vectors’错误?未用$符号却触发报错
报错原因与解决办法
报错原因
NeweyWest()的返回值类型错误:NeweyWest()函数输出的是回归系数的协方差矩阵(属于原子向量/矩阵类),并非像lm()生成的带属性的模型对象。coefficients()函数的适配问题:当你调用coefficients(nw_model)时,该函数默认针对模型对象,会尝试访问object$coefficients属性,但矩阵/原子向量不支持$操作符,因此触发报错。- 额外潜在问题:代码中
rf <- as.numeric(data$ym)完全错误——ym是日期列,转成numeric会得到日期对应的整数,并非无风险利率,这会导致超额收益计算错误,进而出现“essentially perfect fit”的警告。
解决办法
1. 纠正NeweyWest的使用认知
Newey-West方法仅用于计算稳健协方差矩阵/标准误,不会生成新的回归系数,所有回归系数仍来自原OLS模型ols_model。
2. 修正代码
场景1:仅需展示OLS与NW的系数(两者系数完全一致)
data_plot <- data.frame( "Maturity" = c(1, 2, 3, 4, 5), "Coefficient" = c(coefficients(ols_model)[-1], rep(coefficients(ols_model)[-1], length(coefficients(ols_model))-1)), "Model" = c(rep("OLS", length(coefficients(ols_model))-1), rep("NW", length(coefficients(ols_model))-1)) )
场景2:需展示OLS与NW的标准误对比
先通过coeftest()生成带NW标准误的系数表,再提取所需数据:
# 生成带Newey-West标准误的系数结果 nw_coeftest <- coeftest(ols_model, vcov = nw_model) # 分别提取OLS和NW的标准误 ols_se <- coeftest(ols_model)[, "Std. Error"][-1] nw_se <- nw_coeftest[, "Std. Error"][-1] # 构建绘图数据框 data_plot <- data.frame( "Maturity" = c(1, 2, 3, 4, 5), "Coefficient" = rep(coefficients(ols_model)[-1], 2), "Std.Error" = c(ols_se, nw_se), "Model" = c(rep("OLS", length(ols_se)), rep("NW", length(nw_se))) )
3. 修正无风险利率计算错误
将错误的日期转numeric代码替换为实际的无风险利率列(需根据你的数据列名调整):
rf <- data$rf # 假设数据中无风险利率列名为rf,替换为实际列名
内容的提问来源于stack exchange,提问作者user20396712
相关产品推荐
相关产品推荐

