r——绘制方差分布图



我的数据集有两个字段:

  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个值,很难在一张图中绘制所有值
你能为预期的视觉分析提出任何替代方案吗?

如果您计算方差的绝对值(因此它集中在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))

相关内容

  • 没有找到相关文章

最新更新