在R中叠加分布直方图报错:部分x未被计数的问题咨询
问题原因与解决方法
报错核心原因
你遇到的报错主要来自两个点:
- 手动断点未覆盖实际数据范围:你设定的
breakpoints是seq(-0.15,0.15,by=0.01),但苹果股票的对数收益(x.logret)可能存在极端波动(比如突发利空/利好导致涨跌幅度超过15%),这些超出区间的数据无法被hist()统计,触发报错。 - 数据类型干扰:
x.logret是xts时间序列对象,直接传入hist.default()时,可能因时间序列属性导致范围判断异常。
验证与解决步骤
先确认数据真实范围
运行以下代码查看x.logret的极值:range(x.logret)你会发现实际数据的范围大概率超出了
-0.15~0.15区间。动态生成匹配数据的断点
不要手动固定断点,根据数据实际范围生成(留少量余量避免边缘数据遗漏):data_range <- range(x.logret) # 上下各扩展0.01的缓冲区间 breakpoints <- seq(data_range[1] - 0.01, data_range[2] + 0.01, by = 0.01)转换数据类型为普通数值
将xts对象转为数值向量,消除时间序列属性对直方图绘制的干扰:hist(as.numeric(x.logret), breaks=breakpoints, add=TRUE, col="blue", main="")
修改后的完整代码
library(quantmod) x <- getSymbols("AAPL", auto.assign=FALSE) x.logret <- diff(log(x[,6])) x.logret <- na.omit(x.logret) x.avg <- mean(x.logret) x.sd <- sd(x.logret) normal.samples <- rnorm(300, x.avg, x.sd) # 动态生成适配数据的断点 data_range <- range(x.logret) breakpoints <- seq(data_range[1] - 0.01, data_range[2] + 0.01, by = 0.01) hist(normal.samples, breaks=breakpoints, xlab="", main="log return of stock X (blue) vs Normal (gray)") hist(as.numeric(x.logret), breaks=breakpoints, add=TRUE, col="blue", main="")
内容的提问来源于stack exchange,提问作者Bubbles
相关产品推荐
相关产品推荐

