Determining grade intervals transparently

R
Statistics
Grades
Teaching
Autor:in

Johannes Titz

Veröffentlichungsdatum

3. Februar 2022

Introduction

There is also a (German) video on YouTube related to this article:

At German universities, the wonderfully absolute-scaled points are converted into ordinal scales (usually the grades 1.0, 1.3, 1.7, 2.0, 2.3, 2.7, 3.0, 3.3, 3.7, 4.0, 5.0). It may surprise some that this often doesn’t follow a fixed schema. In this short article, we will look at a few calculations and find that grade intervals are equal in size only in exceptional cases.

Quickly upfront: An overview (at the bottom) offers quick navigation for a specific maximum score. If you only want to know the boundaries, these tables suffice. If you’re curious, read on here.

Calculation

We will conduct a small analysis in R, for which we first need to load a few packages:

In the first step, we divide the 11 grades across the range between 50% and 100%. From 50% onwards, an exam is considered passed.

grade_levels <- levels(cut(50:100, 10, include.lowest = TRUE))
grade_levels <- str_sub(grade_levels, 2, -2)
percent <- as.numeric(unique(unlist(strsplit(grade_levels, ","))))
percent
 [1]  50  55  60  65  70  75  80  85  90  95 100

This would already be the first step towards standardization. The boundaries all have equal distances, although the range between 95% and 100% is slightly larger, as 100% is included. In other ranges, the upper value is no longer in the interval. For example, the first range goes from 50 to 54.999, with 55 already in the next interval. Tendentially, the range for 1.0 will thus be larger. This is, of course, unfortunate and subjective (one could also enlarge any other range), but it is not the biggest issue (as we will soon see).

Next, we need a function that combines the maximum score, the percentages, and the corresponding grades and outputs a table of boundaries. Nothing special happens here, except for the function findInterval, which assigns the points to the boundaries. Since the maximum score also needs a grade, we set the parameter rightmost.closed to TRUE.

create_grade <- function(points, percent, grade) {
  max_points <- max(points)
  interval <- findInterval(points, c(0, max(points) * percent / 100),
                           rightmost.closed = T)
  df <- data.frame(points,
                   grade = grade[interval])
  cut_points <- df %>% 
    group_by(grade) %>%
    summarize(min = min(points), max = max(points)) %>%
    mutate(diff = max - min) # the length of the interval
  return(cut_points)
}

Now we can create a few typical cases. The points are generated here via seq with steps of 0.5, as most exams also award half points.

max_points <- seq(20, 40, 0.5)
grade <- c(5, 4, 3.7, 3.3, 3, 2.7, 2.3, 2, 1.7, 1.3, 1)
points <- lapply(max_points, function(x) seq(0, x, 0.5))

grade_list <- lapply(points, create_grade, percent, grade)
names(grade_list) <- paste0("Max Points: ", max_points)

Grade Key Tables

Now we can generate the tables, here using kableExtra. It’s important to note that kbl without kable_styling leads to incorrectly formatted tables. The Hugo theme used seems to assume that the first column has no name, which usually isn’t the case. The cryptic cat command ensures quick navigation by creating an accordion.

res <- Map(function(x, y) 
  kable_styling(kbl(x, col.names = c("Grade", "Min", "Max", "Diff"))),
  grade_list,
  names(grade_list)
)
for (i in seq(res)) {
  cat('\n', '<details class="details-example"><summary>↳', names(res[i]), '</summary>')
  print(res[[i]])
  cat('\n</details>')
}
↳ Max Points: 20
Grade Min Max Diff
1.0 19 20.0 1.0
1.3 18 18.5 0.5
1.7 17 17.5 0.5
2.0 16 16.5 0.5
2.3 15 15.5 0.5
2.7 14 14.5 0.5
3.0 13 13.5 0.5
3.3 12 12.5 0.5
3.7 11 11.5 0.5
4.0 10 10.5 0.5
5.0 0 9.5 9.5
↳ Max Points: 20.5
Grade Min Max Diff
1.0 19.5 20.5 1.0
1.3 18.5 19.0 0.5
1.7 17.5 18.0 0.5
2.0 16.5 17.0 0.5
2.3 15.5 16.0 0.5
2.7 14.5 15.0 0.5
3.0 13.5 14.0 0.5
3.3 12.5 13.0 0.5
3.7 11.5 12.0 0.5
4.0 10.5 11.0 0.5
5.0 0.0 10.0 10.0
↳ Max Points: 21
Grade Min Max Diff
1.0 20.0 21.0 1.0
1.3 19.0 19.5 0.5
1.7 18.0 18.5 0.5
2.0 17.0 17.5 0.5
2.3 16.0 16.5 0.5
2.7 15.0 15.5 0.5
3.0 14.0 14.5 0.5
3.3 13.0 13.5 0.5
3.7 12.0 12.5 0.5
4.0 10.5 11.5 1.0
5.0 0.0 10.0 10.0
↳ Max Points: 21.5
Grade Min Max Diff
1.0 20.5 21.5 1.0
1.3 19.5 20.0 0.5
1.7 18.5 19.0 0.5
2.0 17.5 18.0 0.5
2.3 16.5 17.0 0.5
2.7 15.5 16.0 0.5
3.0 14.0 15.0 1.0
3.3 13.0 13.5 0.5
3.7 12.0 12.5 0.5
4.0 11.0 11.5 0.5
5.0 0.0 10.5 10.5
↳ Max Points: 22
Grade Min Max Diff
1.0 21.0 22.0 1.0
1.3 20.0 20.5 0.5
1.7 19.0 19.5 0.5
2.0 18.0 18.5 0.5
2.3 16.5 17.5 1.0
2.7 15.5 16.0 0.5
3.0 14.5 15.0 0.5
3.3 13.5 14.0 0.5
3.7 12.5 13.0 0.5
4.0 11.0 12.0 1.0
5.0 0.0 10.5 10.5
↳ Max Points: 22.5
Grade Min Max Diff
1.0 21.5 22.5 1.0
1.3 20.5 21.0 0.5
1.7 19.5 20.0 0.5
2.0 18.0 19.0 1.0
2.3 17.0 17.5 0.5
2.7 16.0 16.5 0.5
3.0 15.0 15.5 0.5
3.3 13.5 14.5 1.0
3.7 12.5 13.0 0.5
4.0 11.5 12.0 0.5
5.0 0.0 11.0 11.0
↳ Max Points: 23
Grade Min Max Diff
1.0 22.0 23.0 1.0
1.3 21.0 21.5 0.5
1.7 20.0 20.5 0.5
2.0 18.5 19.5 1.0
2.3 17.5 18.0 0.5
2.7 16.5 17.0 0.5
3.0 15.0 16.0 1.0
3.3 14.0 14.5 0.5
3.7 13.0 13.5 0.5
4.0 11.5 12.5 1.0
5.0 0.0 11.0 11.0
↳ Max Points: 23.5
Grade Min Max Diff
1.0 22.5 23.5 1.0
1.3 21.5 22.0 0.5
1.7 20.0 21.0 1.0
2.0 19.0 19.5 0.5
2.3 18.0 18.5 0.5
2.7 16.5 17.5 1.0
3.0 15.5 16.0 0.5
3.3 14.5 15.0 0.5
3.7 13.0 14.0 1.0
4.0 12.0 12.5 0.5
5.0 0.0 11.5 11.5
↳ Max Points: 24
Grade Min Max Diff
1.0 23.0 24.0 1.0
1.3 22.0 22.5 0.5
1.7 20.5 21.5 1.0
2.0 19.5 20.0 0.5
2.3 18.0 19.0 1.0
2.7 17.0 17.5 0.5
3.0 16.0 16.5 0.5
3.3 14.5 15.5 1.0
3.7 13.5 14.0 0.5
4.0 12.0 13.0 1.0
5.0 0.0 11.5 11.5
↳ Max Points: 24.5
Grade Min Max Diff
1.0 23.5 24.5 1.0
1.3 22.5 23.0 0.5
1.7 21.0 22.0 1.0
2.0 20.0 20.5 0.5
2.3 18.5 19.5 1.0
2.7 17.5 18.0 0.5
3.0 16.0 17.0 1.0
3.3 15.0 15.5 0.5
3.7 13.5 14.5 1.0
4.0 12.5 13.0 0.5
5.0 0.0 12.0 12.0
↳ Max Points: 25
Grade Min Max Diff
1.0 24.0 25.0 1.0
1.3 22.5 23.5 1.0
1.7 21.5 22.0 0.5
2.0 20.0 21.0 1.0
2.3 19.0 19.5 0.5
2.7 17.5 18.5 1.0
3.0 16.5 17.0 0.5
3.3 15.0 16.0 1.0
3.7 14.0 14.5 0.5
4.0 12.5 13.5 1.0
5.0 0.0 12.0 12.0
↳ Max Points: 25.5
Grade Min Max Diff
1.0 24.5 25.5 1.0
1.3 23.0 24.0 1.0
1.7 22.0 22.5 0.5
2.0 20.5 21.5 1.0
2.3 19.5 20.0 0.5
2.7 18.0 19.0 1.0
3.0 17.0 17.5 0.5
3.3 15.5 16.5 1.0
3.7 14.5 15.0 0.5
4.0 13.0 14.0 1.0
5.0 0.0 12.5 12.5
↳ Max Points: 26
Grade Min Max Diff
1.0 25.0 26.0 1.0
1.3 23.5 24.5 1.0
1.7 22.5 23.0 0.5
2.0 21.0 22.0 1.0
2.3 19.5 20.5 1.0
2.7 18.5 19.0 0.5
3.0 17.0 18.0 1.0
3.3 16.0 16.5 0.5
3.7 14.5 15.5 1.0
4.0 13.0 14.0 1.0
5.0 0.0 12.5 12.5
↳ Max Points: 26.5
Grade Min Max Diff
1.0 25.5 26.5 1.0
1.3 24.0 25.0 1.0
1.7 23.0 23.5 0.5
2.0 21.5 22.5 1.0
2.3 20.0 21.0 1.0
2.7 19.0 19.5 0.5
3.0 17.5 18.5 1.0
3.3 16.0 17.0 1.0
3.7 15.0 15.5 0.5
4.0 13.5 14.5 1.0
5.0 0.0 13.0 13.0
↳ Max Points: 27
Grade Min Max Diff
1.0 26.0 27.0 1.0
1.3 24.5 25.5 1.0
1.7 23.0 24.0 1.0
2.0 22.0 22.5 0.5
2.3 20.5 21.5 1.0
2.7 19.0 20.0 1.0
3.0 18.0 18.5 0.5
3.3 16.5 17.5 1.0
3.7 15.0 16.0 1.0
4.0 13.5 14.5 1.0
5.0 0.0 13.0 13.0
↳ Max Points: 27.5
Grade Min Max Diff
1.0 26.5 27.5 1.0
1.3 25.0 26.0 1.0
1.7 23.5 24.5 1.0
2.0 22.0 23.0 1.0
2.3 21.0 21.5 0.5
2.7 19.5 20.5 1.0
3.0 18.0 19.0 1.0
3.3 16.5 17.5 1.0
3.7 15.5 16.0 0.5
4.0 14.0 15.0 1.0
5.0 0.0 13.5 13.5
↳ Max Points: 28
Grade Min Max Diff
1.0 27.0 28.0 1.0
1.3 25.5 26.5 1.0
1.7 24.0 25.0 1.0
2.0 22.5 23.5 1.0
2.3 21.0 22.0 1.0
2.7 20.0 20.5 0.5
3.0 18.5 19.5 1.0
3.3 17.0 18.0 1.0
3.7 15.5 16.5 1.0
4.0 14.0 15.0 1.0
5.0 0.0 13.5 13.5
↳ Max Points: 28.5
Grade Min Max Diff
1.0 27.5 28.5 1.0
1.3 26.0 27.0 1.0
1.7 24.5 25.5 1.0
2.0 23.0 24.0 1.0
2.3 21.5 22.5 1.0
2.7 20.0 21.0 1.0
3.0 19.0 19.5 0.5
3.3 17.5 18.5 1.0
3.7 16.0 17.0 1.0
4.0 14.5 15.5 1.0
5.0 0.0 14.0 14.0
↳ Max Points: 29
Grade Min Max Diff
1.0 28.0 29.0 1
1.3 26.5 27.5 1
1.7 25.0 26.0 1
2.0 23.5 24.5 1
2.3 22.0 23.0 1
2.7 20.5 21.5 1
3.0 19.0 20.0 1
3.3 17.5 18.5 1
3.7 16.0 17.0 1
4.0 14.5 15.5 1
5.0 0.0 14.0 14
↳ Max Points: 29.5
Grade Min Max Diff
1.0 28.5 29.5 1.0
1.3 27.0 28.0 1.0
1.7 25.5 26.5 1.0
2.0 24.0 25.0 1.0
2.3 22.5 23.5 1.0
2.7 21.0 22.0 1.0
3.0 19.5 20.5 1.0
3.3 18.0 19.0 1.0
3.7 16.5 17.5 1.0
4.0 15.0 16.0 1.0
5.0 0.0 14.5 14.5
↳ Max Points: 30
Grade Min Max Diff
1.0 28.5 30.0 1.5
1.3 27.0 28.0 1.0
1.7 25.5 26.5 1.0
2.0 24.0 25.0 1.0
2.3 22.5 23.5 1.0
2.7 21.0 22.0 1.0
3.0 19.5 20.5 1.0
3.3 18.0 19.0 1.0
3.7 16.5 17.5 1.0
4.0 15.0 16.0 1.0
5.0 0.0 14.5 14.5
↳ Max Points: 30.5
Grade Min Max Diff
1.0 29.0 30.5 1.5
1.3 27.5 28.5 1.0
1.7 26.0 27.0 1.0
2.0 24.5 25.5 1.0
2.3 23.0 24.0 1.0
2.7 21.5 22.5 1.0
3.0 20.0 21.0 1.0
3.3 18.5 19.5 1.0
3.7 17.0 18.0 1.0
4.0 15.5 16.5 1.0
5.0 0.0 15.0 15.0
↳ Max Points: 31
Grade Min Max Diff
1.0 29.5 31.0 1.5
1.3 28.0 29.0 1.0
1.7 26.5 27.5 1.0
2.0 25.0 26.0 1.0
2.3 23.5 24.5 1.0
2.7 22.0 23.0 1.0
3.0 20.5 21.5 1.0
3.3 19.0 20.0 1.0
3.7 17.5 18.5 1.0
4.0 15.5 17.0 1.5
5.0 0.0 15.0 15.0
↳ Max Points: 31.5
Grade Min Max Diff
1.0 30.0 31.5 1.5
1.3 28.5 29.5 1.0
1.7 27.0 28.0 1.0
2.0 25.5 26.5 1.0
2.3 24.0 25.0 1.0
2.7 22.5 23.5 1.0
3.0 20.5 22.0 1.5
3.3 19.0 20.0 1.0
3.7 17.5 18.5 1.0
4.0 16.0 17.0 1.0
5.0 0.0 15.5 15.5
↳ Max Points: 32
Grade Min Max Diff
1.0 30.5 32.0 1.5
1.3 29.0 30.0 1.0
1.7 27.5 28.5 1.0
2.0 26.0 27.0 1.0
2.3 24.0 25.5 1.5
2.7 22.5 23.5 1.0
3.0 21.0 22.0 1.0
3.3 19.5 20.5 1.0
3.7 18.0 19.0 1.0
4.0 16.0 17.5 1.5
5.0 0.0 15.5 15.5
↳ Max Points: 32.5
Grade Min Max Diff
1.0 31.0 32.5 1.5
1.3 29.5 30.5 1.0
1.7 28.0 29.0 1.0
2.0 26.0 27.5 1.5
2.3 24.5 25.5 1.0
2.7 23.0 24.0 1.0
3.0 21.5 22.5 1.0
3.3 19.5 21.0 1.5
3.7 18.0 19.0 1.0
4.0 16.5 17.5 1.0
5.0 0.0 16.0 16.0
↳ Max Points: 33
Grade Min Max Diff
1.0 31.5 33.0 1.5
1.3 30.0 31.0 1.0
1.7 28.5 29.5 1.0
2.0 26.5 28.0 1.5
2.3 25.0 26.0 1.0
2.7 23.5 24.5 1.0
3.0 21.5 23.0 1.5
3.3 20.0 21.0 1.0
3.7 18.5 19.5 1.0
4.0 16.5 18.0 1.5
5.0 0.0 16.0 16.0
↳ Max Points: 33.5
Grade Min Max Diff
1.0 32.0 33.5 1.5
1.3 30.5 31.5 1.0
1.7 28.5 30.0 1.5
2.0 27.0 28.0 1.0
2.3 25.5 26.5 1.0
2.7 23.5 25.0 1.5
3.0 22.0 23.0 1.0
3.3 20.5 21.5 1.0
3.7 18.5 20.0 1.5
4.0 17.0 18.0 1.0
5.0 0.0 16.5 16.5
↳ Max Points: 34
Grade Min Max Diff
1.0 32.5 34.0 1.5
1.3 31.0 32.0 1.0
1.7 29.0 30.5 1.5
2.0 27.5 28.5 1.0
2.3 25.5 27.0 1.5
2.7 24.0 25.0 1.0
3.0 22.5 23.5 1.0
3.3 20.5 22.0 1.5
3.7 19.0 20.0 1.0
4.0 17.0 18.5 1.5
5.0 0.0 16.5 16.5
↳ Max Points: 34.5
Grade Min Max Diff
1.0 33.0 34.5 1.5
1.3 31.5 32.5 1.0
1.7 29.5 31.0 1.5
2.0 28.0 29.0 1.0
2.3 26.0 27.5 1.5
2.7 24.5 25.5 1.0
3.0 22.5 24.0 1.5
3.3 21.0 22.0 1.0
3.7 19.0 20.5 1.5
4.0 17.5 18.5 1.0
5.0 0.0 17.0 17.0
↳ Max Points: 35
Grade Min Max Diff
1.0 33.5 35.0 1.5
1.3 31.5 33.0 1.5
1.7 30.0 31.0 1.0
2.0 28.0 29.5 1.5
2.3 26.5 27.5 1.0
2.7 24.5 26.0 1.5
3.0 23.0 24.0 1.0
3.3 21.0 22.5 1.5
3.7 19.5 20.5 1.0
4.0 17.5 19.0 1.5
5.0 0.0 17.0 17.0
↳ Max Points: 35.5
Grade Min Max Diff
1.0 34.0 35.5 1.5
1.3 32.0 33.5 1.5
1.7 30.5 31.5 1.0
2.0 28.5 30.0 1.5
2.3 27.0 28.0 1.0
2.7 25.0 26.5 1.5
3.0 23.5 24.5 1.0
3.3 21.5 23.0 1.5
3.7 20.0 21.0 1.0
4.0 18.0 19.5 1.5
5.0 0.0 17.5 17.5
↳ Max Points: 36
Grade Min Max Diff
1.0 34.5 36.0 1.5
1.3 32.5 34.0 1.5
1.7 31.0 32.0 1.0
2.0 29.0 30.5 1.5
2.3 27.0 28.5 1.5
2.7 25.5 26.5 1.0
3.0 23.5 25.0 1.5
3.3 22.0 23.0 1.0
3.7 20.0 21.5 1.5
4.0 18.0 19.5 1.5
5.0 0.0 17.5 17.5
↳ Max Points: 36.5
Grade Min Max Diff
1.0 35.0 36.5 1.5
1.3 33.0 34.5 1.5
1.7 31.5 32.5 1.0
2.0 29.5 31.0 1.5
2.3 27.5 29.0 1.5
2.7 26.0 27.0 1.0
3.0 24.0 25.5 1.5
3.3 22.0 23.5 1.5
3.7 20.5 21.5 1.0
4.0 18.5 20.0 1.5
5.0 0.0 18.0 18.0
↳ Max Points: 37
Grade Min Max Diff
1.0 35.5 37.0 1.5
1.3 33.5 35.0 1.5
1.7 31.5 33.0 1.5
2.0 30.0 31.0 1.0
2.3 28.0 29.5 1.5
2.7 26.0 27.5 1.5
3.0 24.5 25.5 1.0
3.3 22.5 24.0 1.5
3.7 20.5 22.0 1.5
4.0 18.5 20.0 1.5
5.0 0.0 18.0 18.0
↳ Max Points: 37.5
Grade Min Max Diff
1.0 36.0 37.5 1.5
1.3 34.0 35.5 1.5
1.7 32.0 33.5 1.5
2.0 30.0 31.5 1.5
2.3 28.5 29.5 1.0
2.7 26.5 28.0 1.5
3.0 24.5 26.0 1.5
3.3 22.5 24.0 1.5
3.7 21.0 22.0 1.0
4.0 19.0 20.5 1.5
5.0 0.0 18.5 18.5
↳ Max Points: 38
Grade Min Max Diff
1.0 36.5 38.0 1.5
1.3 34.5 36.0 1.5
1.7 32.5 34.0 1.5
2.0 30.5 32.0 1.5
2.3 28.5 30.0 1.5
2.7 27.0 28.0 1.0
3.0 25.0 26.5 1.5
3.3 23.0 24.5 1.5
3.7 21.0 22.5 1.5
4.0 19.0 20.5 1.5
5.0 0.0 18.5 18.5
↳ Max Points: 38.5
Grade Min Max Diff
1.0 37.0 38.5 1.5
1.3 35.0 36.5 1.5
1.7 33.0 34.5 1.5
2.0 31.0 32.5 1.5
2.3 29.0 30.5 1.5
2.7 27.0 28.5 1.5
3.0 25.5 26.5 1.0
3.3 23.5 25.0 1.5
3.7 21.5 23.0 1.5
4.0 19.5 21.0 1.5
5.0 0.0 19.0 19.0
↳ Max Points: 39
Grade Min Max Diff
1.0 37.5 39 1.5
1.3 35.5 37 1.5
1.7 33.5 35 1.5
2.0 31.5 33 1.5
2.3 29.5 31 1.5
2.7 27.5 29 1.5
3.0 25.5 27 1.5
3.3 23.5 25 1.5
3.7 21.5 23 1.5
4.0 19.5 21 1.5
5.0 0.0 19 19.0
↳ Max Points: 39.5
Grade Min Max Diff
1.0 38 39.5 1.5
1.3 36 37.5 1.5
1.7 34 35.5 1.5
2.0 32 33.5 1.5
2.3 30 31.5 1.5
2.7 28 29.5 1.5
3.0 26 27.5 1.5
3.3 24 25.5 1.5
3.7 22 23.5 1.5
4.0 20 21.5 1.5
5.0 0 19.5 19.5
↳ Max Points: 40
Grade Min Max Diff
1.0 38 40.0 2.0
1.3 36 37.5 1.5
1.7 34 35.5 1.5
2.0 32 33.5 1.5
2.3 30 31.5 1.5
2.7 28 29.5 1.5
3.0 26 27.5 1.5
3.3 24 25.5 1.5
3.7 22 23.5 1.5
4.0 20 21.5 1.5
5.0 0 19.5 19.5

The tables can serve the standardization of grade calculation at universities. However, it would be much better to simply specify percentage values from the maximum achievable points. This has only advantages, but there are certainly some legal and bureaucratic hurdles. Nevertheless, students could be informed of both the achieved percentages and the grade. Students would surely realize that percentage values are more meaningful and would also demand this information for other exams. This way, a critical mass for change could be reached.

Tables as CSV for Import into OPAL

March 2023 Addendum: In the LMS OPAL (which we currently use), grade mappings can now be imported as CSV. We only need to create the CSV files:

Map(function(x, y) write.table(x[ , c(1, 3, 2)], file = y, col.names = F,
                               row.names = F, sep = ";"),
    grade_list,
    paste0(substr(names(grade_list), 13, 16), ".csv"))

20.csv    20.5.csv    21.csv    21.5.csv    22.csv    22.5.csv    23.csv    23.5.csv    24.csv    24.5.csv   25.csv    25.5.csv    26.csv    26.5.csv    27.csv    27.5.csv    28.csv    28.5.csv    29.csv    29.5.csv   30.csv    30.5.csv    31.csv    31.5.csv    32.csv    32.5.csv    33.csv    33.5.csv    34.csv    34.5.csv   35.csv    35.5.csv    36.csv    36.5.csv    37.csv    37.5.csv    38.csv    38.5.csv    39.csv    39.5.csv   40.csv