可视化重复测量(非纵向)

机器算法验证 数据可视化 重复测量
2022-03-22 23:52:13

我对大量变量和大约一百个人重复测量。

重复这些测量以确保可重复性并且不是纵向时间点。

我想为这些变量提供摘要和/或图表,但是整个列的任何计算(甚至对每个人的测量数量进行加权)都会丢失个人内方差的重要信息。

另一方面,为这么多人提供分组数据是不现实的。

这是我迄今为止对 9 个不满意的地块进行的模拟。两者都不适用于很多人。

library(tidyverse)
N1=9 #individuals
N2=25 #measures
#for each N1 individuals, take N2 values based on a specific mean and variance (both from a normal distribution)
df = expand.grid(individual=factor(1:N1), measure=LETTERS[1:N2]) %>% 
  arrange(individual) %>% 
  group_by(individual) %>% 
  mutate(
    base_mean = rnorm(1, 0, 50),
    base_var = abs(rnorm(1, 0, 10)),
    value = rnorm(n(), base_mean, base_var),
  ) %>% 
  identity()

#draw 1 boxplot with individuals as colors
ggplot(df, aes(x="x", y=value)) + 
  geom_boxplot() + 
  geom_jitter(aes(color=individual), width=0.1, alpha=0.9)

#draw 1 boxplot per individual
ggplot(df, aes(x=individual, y=value)) + 
  geom_boxplot()

reprex 包(v2.0.0)于 2021-09-18 创建

有没有办法可视化或总结个体内部和个体之间的数据?

2个回答

Ed Tufte对箱线图的备用重新设计允许显示一个大的“小倍数”图形。Tufte 提出的另一点是,通过根据另一个因素订购小倍数,人们通常会从图形中获得“免费”信息。按中值或框高对图进行排序通常很有见地,因为统计数据之间的关系(尤其是level 和 spread之间的关系)提出了重新表达数据的有用方法。

以下是基于问题中的代码(用于生成示例数据)和前 CV 主持人 chl 提供的用于制作绘图的代码的示例。

九个箱线图

图 1:按中位数降序排列的九个箱线图

100 个箱线图

图 2:100 个箱线图

500 个箱线图(对数刻度)

图 3

按价差排序的 50 个箱线图

图 4

R代码

#
# Courtesy chl.  Code has been simplified and customized.
#
tufte.boxplot <- function(x, g, thickness=1, col.med="White", ...) {
  k <- nlevels(g)
  plot(c(1,k), range(x), type="n",
       xlab=deparse(substitute(g)), ylab=deparse(substitute(x)), ...)
  for (i in 1:k)
    with(boxplot.stats(x[as.numeric(g)==i]), {
      segments(i, stats[2], i, stats[4], col=gray(.10), lwd=thickness) # "Box"
      segments(i, stats[1], i, stats[2], col=gray(.7))   # Bottom whisker
      segments(i, stats[4], i, stats[5], col=gray(.7))   # Top whisker
      points(rep(i, length(out)), out, cex=.8)           # Outliers
      points(i, stats[3], cex=1.0, col=col.med, pch=19)  # Median
    })
}
#
# Create data.
#
N <- 9       # Number of individuals
# N <- 100
# N <- 50
set.seed(17) # For reproducibility

# Vary the counts, medians, and spreads
l <- lapply(3 + rpois(N, 5), function(n) 
  exp(rnorm(n, log(rgamma(1, 20, scale=1/20)), sqrt(rgamma(1, 15, 60))))
)
df <- do.call(rbind, lapply(seq_along(l), 
                     function(i) data.frame(Individual=factor(i), Value=l[[i]])))
#
# Visualize.
#
# Order by decreasing median
df$Individual <- with(df, reorder(Individual, Value, function(x) -median(x)))
# Alternatively, order by decreasing IQR
df$Individual <- with(df, reorder(Individual, Value, 
                                  function(x) diff(quantile(x, c(3/4, 1/4)))))

with(df, tufte.boxplot(Value, Individual, bty="n", xaxt="n", log="", 
                       col.med="#8080f080", thickness=2,
                       main="Ordered Boxplots Ordered by Spread (IQR)"))

在我看来,第二个情节还不错。我可能只是添加colour = ,以便每个人都有自己的颜色,但是关于该情节的两个主要内容是:

  • 个体之间存在很大差异

  • 相比之下,个体内部的差异要小得多

  • 存在相当大的异质性。特别是,三个人的变异似乎极低