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

在R中叠加分布直方图报错:部分x未被计数的问题咨询

问题原因与解决方法

报错核心原因

你遇到的报错主要来自两个点:

  • 手动断点未覆盖实际数据范围:你设定的breakpoints是seq(-0.15,0.15,by=0.01),但苹果股票的对数收益(x.logret)可能存在极端波动(比如突发利空/利好导致涨跌幅度超过15%),这些超出区间的数据无法被hist()统计,触发报错。
  • 数据类型干扰:x.logret是xts时间序列对象,直接传入hist.default()时,可能因时间序列属性导致范围判断异常。

验证与解决步骤

  1. 先确认数据真实范围
    运行以下代码查看x.logret的极值:

    range(x.logret)
    

    你会发现实际数据的范围大概率超出了-0.15~0.15区间。

  2. 动态生成匹配数据的断点
    不要手动固定断点,根据数据实际范围生成(留少量余量避免边缘数据遗漏):

    data_range <- range(x.logret)
    # 上下各扩展0.01的缓冲区间
    breakpoints <- seq(data_range[1] - 0.01, data_range[2] + 0.01, by = 0.01)
    
  3. 转换数据类型为普通数值
    将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 09:35:06