【问题标题】:Plotting distribution of variances绘制方差分布
【发布时间】:2021-09-05 04:43:47
【问题描述】:

我的数据集有 2 个字段:

  1. 时间戳 t --- 在 0 到 60 之间变化
  2. 变量 x – 变量(例如,A)的值从 t-1 到 t 的变化。在 -100% 到 100% 之间变化

每个时间戳值大约有 500 条记录-例如
500 条记录,其中 t= 0 且 x 取 -100% 到 100% 之间的任何值
490 条记录,其中 t= 1 且 x 取 -100% 到 100% 之间的任何值,依此类推。
请注意,对于大约 80% 的记录,x 的值为 0

这里的目的是确定在 t 的什么值(可以是一个值或一个范围,例如,当 t=22 或介于 20 -25 之间)时,A 的每日变化是最小值:这有效地转化为当 x 非常频繁地 = 0 时找出 t,而当 x 不是时,至少接近于零。
为此,我的目标是绘制 x 每天的方差。我可以考虑使用带有 x(Y 轴)和 t(X 轴)的小提琴图,但是 t 有 60 个值,因此很难在一张图表中绘制所有内容。
您能否为预期的视觉分析建议任何替代图?

【问题讨论】:

    标签: r ggplot2 distribution probability-density violin-plot


    【解决方案1】:

    如果您计算方差的绝对值(因此它集中在 0-100)并在此处尝试使用日志,是否有帮助? https://stats.stackexchange.com/questions/251066/boxplot-for-data-with-a-large-number-of-zero-values.

    当您说最小时,您的意思是最接近 0,对吧?在这种情况下,最好减少绝对方差(在 0-1 范围内),因为您可以将其视为零膨胀二项式数据,例如使用 VGAM 包:https://rdrr.io/cran/VGAM/man/zibinomial.html

    我玩过,下面是一个我认为有意义的例子。我只有零膨胀模型的一些经验,所以如果有人有一些反馈会很好:)

    library(ggplot2)
    library(data.table)
    library(VGAM)
    
    # simulate some data
    N_t <- 60 # number of t
    N_o <- 500 # number of observations at t
    t_smallest <- 30 # best value
    # simulate some data crudely
    set.seed(1)
    dataL <- lapply(1:N_t, function(t){
      
      dist <- abs(t_smallest-t)+10
      values <- round(rbeta(N_o, 10/dist, 300/dist), 2) * sample(c(-1,1), N_o, replace=TRUE)
      data.table(t, values)
    })
    data <- rbindlist(dataL)
    # raw
    ggplot(data, aes(factor(t), values)) + geom_boxplot() + 
      coord_cartesian(ylim=c(0, 0.1))
    # log transformed - may look better with your data
    ggplot(data, aes(factor(t), log(abs(values)+1))) + 
      geom_violin()
    
    # use absolute values, package needs it as integer p & n, so approximate these
    data[, abs.values := abs(values)]
    data[, p := round(1000*abs.values, 0)]
    data[, n := 1000]
    # with a gam, so smooth fit on t. Found it to be unstable though
    fit <- vgam(cbind(p, n-p) ~ s(t), zibinomialff, data = data, trace = TRUE)
    # glm, with a coefficient for each t, so treats independently
    fit2 <- vglm(cbind(p, n-p) ~ factor(t), zibinomialff, data = data, trace = TRUE)
    
    # predict
    output <- data.table(t=1:N_t)
    output[, prediction := predict(fit, newdata=output, type="response")]
    output[, prediction2 := predict(fit2, newdata=output, type="response")]
    
    # plot out with predictions
    ggplot(data, aes(factor(t), abs.values)) + 
      geom_boxplot(col="darkgrey") + 
      geom_line(data=output, aes(x=t, y=prediction2)) + 
      geom_line(data=output, aes(x=t, y=prediction), col="darkorange") + 
      geom_vline(xintercept = output[prediction==min(prediction), t]) +
      coord_cartesian(ylim=c(0, 0.1))
    

    【讨论】:

    • 非常感谢。或者,如果我认为 +/- 2% 的方差是可以接受的,并根据此条件将 x 转换为二进制变量怎么办?然后在给定数据的情况下(即,从每个 t 的 500 条 x 记录中)找到每个 t 的 x=0(成功)的概率?你知道如何在 R 中解决这个问题吗?
    • 解释一下,我如何确定每个 t 值的 x=success 的概率密度函数(即 |x|
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 2020-06-21
    • 1970-01-01
    • 2013-02-10
    • 2012-08-15
    相关资源
    最近更新 更多