You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言股票收益率正态性检验Shapiro.test报错求助

报错原因
  • 核心触发点:shapiro.test()仅支持输入纯数值向量,你传入的DNBreturn是dailyReturn()生成的xts时间序列对象,自带时间索引等特殊属性,函数无法解析该类对象就会抛出对应报错。
  • 隐性问题:你调用dailyReturn()时给leading参数传入了字符串"FALSE",实际该参数要求接收逻辑值FALSE,参数类型不匹配也可能导致返回值生成异常空值,进一步加重函数解析问题。
  • 额外不规范写法:getSymbols()默认开启auto.assign = TRUE,会直接将获取到的行情数据写入全局环境变量,你赋值给DNB的实际是字符串"DNB.OL"而非行情数据集,只是因为全局环境已经自动生成了DNB.OL变量才没有提前报错。
解决方法

你可以任选以下一种方式修改代码即可正常运行检验:

  1. 调用检验函数时直接转换格式,手动剔除空值:
# 把xts对象转为纯数值向量,去掉空值后传入检验函数
shapiro.test(as.numeric(na.omit(DNBreturn)))
  1. 生成收益率时就转成纯数值向量,后续所有调用都不用额外处理:
# 修正leading参数的类型,同时转成数值向量
DNBreturn <- as.numeric(dailyReturn(DNBclose, type = "log", leading = FALSE))
# 后续直接调用即可
shapiro.test(DNBreturn)
  1. (推荐)同时修正getSymbols的不规范写法,避免依赖全局环境自动赋值:
library(quantmod)
# 加auto.assign = FALSE,直接把数据集赋值给DNB变量
DNB = getSymbols("DNB.OL", src = 'yahoo', 
           from = "2020-01-01",
           to = "2020-12-31",
           auto.assign = FALSE)

DNBclose <- DNB$DNB.OL.Close
# 修正参数类型+转数值向量
DNBreturn <- as.numeric(dailyReturn(DNBclose, type = "log", leading = FALSE))

std <- sqrt(var(DNBreturn, na.rm = TRUE))
DNBmean <- mean(DNBreturn, na.rm = TRUE)

DNBhist <- hist(DNBreturn, density=20, breaks=20, prob=TRUE, 
     xlab="x-variable", ylim=c(0, 35), 
     main="normal curve over histogram")
 curve(dnorm(x, mean=DNBmean, sd=std), 
      col="darkblue", lwd=2, add=TRUE, yaxt="n")
# 直接运行检验
shapiro.test(DNBreturn)

内容的提问来源于stack exchange,提问作者Magnus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 05:06:04