“microbenchmark”中“cld”列的含义是什么?

Sté*_*ent 2 statistics r microbenchmark

我一直以为cld输出中的那一栏microbenchmark是速度的统计排名。然而事实并非如此:

> microbenchmark(
+   intmap = fintmap(), # slower
+   List   = flist(),
+   times = 5
+ )
Unit: microseconds
   expr     min      lq      mean  median       uq      max neval cld
 intmap 793.984 910.539 1145.8608 911.840 1290.529 1822.412     5  a 
   List   1.092   1.318  201.3712   1.639    3.660  999.147     5   b
Run Code Online (Sandbox Code Playgroud)

那么它是什么?该文件只说这是一个统计排名,但是什么?

或者也许这是速度的多重比较测试,但标准差的不等性会导致这样的问题?第二个基准显然存在异常值。


编辑

看来我的问题没有说清楚。a我知道字母和的含义b,这是报告 Tukey 测试的经典方法。但这里的结果并不一致:intmap速度较慢但排名第一。

PGS*_*GSA 5

cld是从包装中取出的紧凑型字母显示器multcomp

从该包中可以看出:“相同的字母表示没有显着差异。”

我目前无法确定它是要排名还是只是分类,即a通常要快于b还是只是不同?

中的代码microbenchmark::summary是:

      ops <- options(warn=-1)
      mdl <- lm(time ~ expr, object)
      comp <- multcomp::glht(mdl, multcomp::mcp(expr = "Tukey"))
      res$cld <- multcomp::cld(comp)$mcletters$monospacedLetters
Run Code Online (Sandbox Code Playgroud)

因此,从这一点来看,它似乎是lm()从原始时间(而不是平均值等)生成线性模型,然后glht()为所有对比较设置多重比较对象,然后使用cld().

编辑:测试排名:

a <- rnorm(1000)
a

microbenchmark(
  alpha = mean(a),
  beta = a/length(a) |> sum(),
  gamma = sum(a) / length(a),
  times = 10000,
  unit = "nanoseconds"
)

Unit: nanoseconds
  expr  min   lq    mean median   uq      max neval cld
 alpha 4700 5500 6325.56   5700 6800    37700 10000  a 
  beta 1700 2700 5307.55   2900 3300 12419800 10000  a 
 gamma  900 1100 1240.32   1100 1300    24000 10000   b

microbenchmark(
  gamma = sum(a) / length(a),
  alpha = mean(a),
  beta = a/length(a) |> sum(),
  times = 10000,
  unit = "nanoseconds"

Unit: nanoseconds
  expr  min   lq    mean median   uq      max neval cld
 gamma  900 1100 1214.29   1100 1200    23700 10000  a 
 alpha 4900 5500 6039.82   5700 6200    71900 10000   b
  beta 1700 2500 5459.20   3000 3200 12272900 10000   b
)

Run Code Online (Sandbox Code Playgroud)

这似乎表明,正如所怀疑的,表中条目的顺序按照提供的方式列出microbenchmark(),并且 cld 是根据此顺序而不是总体速度排名按顺序分配的。

编辑2:玩弄排序

d <- microbenchmark(
  alpha = mean(a),
  beta = a/length(a) |> sum(),
  gamma = sum(a + a - a) / length(a),
  times = 10000,
  unit = "nanoseconds"
)

print(d, order = "cld")

Unit: nanoseconds
  expr  min   lq    mean median   uq     max neval cld
  beta 1700 1900 2386.04   2000 2300   53400 10000   b
 alpha 5000 5500 6219.35   5700 6400   72700 10000  a 
 gamma 1900 2200 4378.53   2400 2600 8532200 10000  ab

Run Code Online (Sandbox Code Playgroud)

在我看来,它按字母顺序对 cld 进行排序,就好像它是一组列一样,因此它按 a (顶部空白)然后按 b (同上)等排序......