COVID-19: Die Wirkung politischer Maßnahmen auf die Zahl positiver Tests

Die dritte Welle der Corona-Pandemie scheint gebrochen. Das ist super und ich bin voller Hoffnung, dass wir langsam Richtung Ende der Pandemie blicken. Sommer und steigende Impfzahlen geben mir Hoffnung, für meinen geplanten Sommerurlaub am Gardasee.

Gleichzeitig bin ich ein sehr neugieriger Mensch und frage mich: Wie haben wir es geschafft die dritte Welle zu brechen? Vielleicht waren es ja die politischen Maßnahmen, die eingeführte Bundesnotbremse die zum Rückgang der Infektionszahlen geführt hat?

Schaut man sich die Zahl der positiven Tests der letzten Monate an, scheint die Annahme, dass politische Maßnahmen einen Einfluss auf den Rückgang der positiven Tests hatten plausibel:

Nach dem Beschluss des Lockdown Light Anfang November 2020, nach der Verschärfung des Lockdown Mitte Dezember 2020, sowie nach Beschluss der Notbremse im April 2021 steigen die berichteten positiven Testfälle langsamer oder gehen zurück.

Genauso scheint es, als seien die steigenden Zahlen und damit die dritte Welle durch die beschlossenen Lockerungsschritte Anfang März zu erklären.

Leider trügt diese Darstellung, was vor allem zwei Gründe hat:

  1. Berichtete positive Tests bilden das Geschehen ungefähr 10 bis 14 Tage vor dem Berichtsdatum ab
  2. Dass Virus verbreitet sich exponentiell – lineare Anstiege sind kein guter Indikator für die Infektionsdynamik

Um diese beiden Probleme auszugleichen hat das RKI vor über einem Jahr bereits das Nowcasting entwickelt: https://www.rki.de/DE/Content/InfAZ/N/Neuartiges_Coronavirus/Projekte_RKI/Nowcasting.html

Aus verschiedenen Daten wird das tatsächliche Erkrankungsdatum geschätzt und damit auch die Reproduktionszahl (R-Wert) geschätzt. Der R-Wert war vor allem vor einem Jahr präsent und gibt an, wie viele Menschen ein Infizierter Mensch ansteckt. ein R-Wert größer als 1 bedeutet exponentiell steigende Zahlen, ein R-Wert kleiner als 1 einen Rückgang der Zahl positiver Tests.

Um die Dynamik des Infektionsgeschehens zu bewerten ist der R-Wert also die richtige Wahl. Durch Analyse des zeitlichen Verlaufs des R-Werts können Einflusspunkte identifiziert werden, an denen sich der R-Wert ändert. Eine Veränderung der Entwicklung des R-Werts deutet daraufhin, dass irgendetwas passiert ist, das Einfluss auf die Infektionsdynamik hatte. Ich habe mir den 7 Tage R-Wert aus dem Nowcasting des RKI angeschaut und Einflusspunkte identifiziert:

Einflusspunkte sind immer dort, wo entweder Gipfel vorliegen, oder nach einer Zeit relativer Stabilität sich das Niveau des R-Werts beginnt zu verändern. Ich habe vier Einflusspunkte ausgewählt. Um die Einflusspunkte (gestrichelte Linien) herum habe ich einen 10 Tageskorridor gebaut (grüner Bereich) in dem vermutlich irgendetwas geschehen ist, dass Einfluss auf die Infektionsdynamik hatte.

Legt man die Einflusskorridore auf die Zahl der berichtete positiven Tests, ergibt sich folgendes Bild:

Bei diesem Bild wird deutlich, dass die Einflusskorridore durchaus treffend gewählt sind. Nach den Einflusskorridoren verändert sich das Wachstum der positiven Testzahlen in die jeweils erwartete Richtung. Hier braucht es genaues Hinschauen. Eine Reduzierung des R-Werts von ca. 1,2 auf 1 ist schon ein Signal dafür, dass die Infektionsdynamik verlangsamt wird, die absolute Zahl der positiven Tests steigt aber weiter an. Dieses Muster is im Dezember 2020 zu sehen.

Diese Darstellung veranschaulicht aber auch, wie schwierig es ist, den Effekt von Maßnahmen und Entscheidungen zu überprüfen. Es Vergehen mindestens 2 Wochen, bis sich überhaupt Effekte in der Zahl der positiven Tests zeigen. Und diese Effekte sind dann eher Wachstumsverlangsamung oder Stagnation und noch nicht unbedingt Rückgang der Zahlen.

Legt man die Infektionskorridore neben die politischen Beschlüsse auf Bundesebene ergibt sich folgendes Bild:

Der Zeitpunkt von politischen Beschlüssen liegt recht systematisch nach den Einflusskorridoren, die ich durch die Betrachtung des R-Werts identifiziert habe. Das isst recht ernüchternd, weil es nahelegt, dass die politischen Entschlüsse wenig Einfluss auf die Infektionsdynamik hatten. Zwei Hypothesen lassen sich recht sicher aufstellen:

  • Die 3. Welle baute sich schon auf, lange (knapp einen Monat) bevor Lockerungen beschlossen wurden
  • Der Beschluss der Bundesnotbremse kam gut zwei Wochen zu spät um für dass Brechen der 3. Welle (mit-) verantwortlich zu sein

Wichtig ist mir zu erwähnen, dass den politischen Entschlüssen mehrwöchige Diskussionen vorausgingen, die medial massive Aufmerksamkeit erhielten. D.h. möglicherweise war die Diskussion und Berichterstattung über den politische Entscheidungsprozess ein relevanter Einflussfaktor. Zumindest zeitlich würde das durchaus zu den Einflusskorridoren passen. Persönlich, aus der Erfahrung systemtheoretischer Beratung liegt mir der Gedanke sehr nahe, dass der Entscheidungsprozess mächtiger ist , als die formale Entscheidung.

Zu wissen, was nicht Einfluss auf die Infektionsdynamik nimmt, ist leider nur begrenzt hilfreich. Viel spannender ist natürlich herauszufinden, was tatsächlich Einfluss hat. Das wäre die Grundlage um zielgerichtete Maßnahmen setzen zu können.

Zumindest der Beginn der dritten Welle scheint recht gut durch das Aufkommen der Variante B.1.1.7 erklärbar: Diesen Schluss legt der stetig steigende Anteil dieser Variante ab Februar 2021 nahe, welcher mit dem Einflusskorridor im Februar zusammenfällt.

Diese Erklärung hilft aber auch nur dabei zu erklären, welche Umstände das Infektionsgeschehen verschlimmern (Virusvarianten!). Wofür mir bisher jegliche stichhaltige Erklärung fehlt, ist, welche Faktoren die Ausbreitung verlangsamen. Das ist das eigentliche Dilemma. Wir haben bis heute – abgesehen von AHA und Kontaktreduzierung – keine Ahnung, wie wir es schaffen Wellen zu brechen.

Dass ich kaum belastbare Evidenz für die Wirksamkeit formeller Maßnahmen finde und einige Maßnahmen grundsätzlich nicht nachvollziehen kann (Nächtliche Ausgangssperre?!) erschwert es zusätzlich Geduld und Akzeptanz aufzubringen. Aus meiner persönlichen Sicht, sitze ich seit sieben Monaten einfach im Home Office, tue eigentlich immer das gleiche und beobachte fasziniert, wie sich die Zahlen positiver Tests mal rauf und mal runter bewegen. Was ich persönlich tue, hat offensichtlich keinen Einfluss auf die Zahlen, deren Entwicklung ich mir trotz Fantasie, Mühe und Recherche häufig nur sehr schwer erklären kann.

Egal. Gerade gibt es ein Licht im Tunnel. Noch drei Monate bis zum Sommerurlaub, der vermutlich auch stattfinden kann.

COVID-19: Der Zusammenhang zwischen Tests und Infektionen

Auf geht es in eine neue Runde COVID-19 Datenanalyse mit R. Thema heute: Wie hängen Zahl der Tests und Zahl der berichteten Infektionen zusammen?

Die Behauptung, steigende Infektionszahlen seien dadurch begründet, dass mehr getestet wird, dürfte jedem schon begegnet sein. Erfreulicherweise finden sich beim RKI nicht nur die Infektionszahlen sondern auch Daten zu Tests:

Dass die Zahl der Tests und die Zahl der Infektionen zusammenhängt ist offensichtlich und trivial: Ohne Tests, kann es keine berichteten Infektionen geben. Die berichtete Infektionszahl ist abhängig von der Testzahl, es geht gar nicht anders.

Ob Veränderungen in er Teststrategie oder das tatsächliche Infektionsgeschehen ursächlich für die veränderten berichteten Infektionszahlen sind ist eine komplett andere Frage. Sie lässt sich anhand der Zeitreihendaten analysieren.

Ich habe die Daten normalisiert (auf eine Skala gebracht) und geplottet. Infektionszahlen, werden täglich von Gesundheitsämtern an das RKI übermittelt, Testzahlen wöchentlich von Laboren. Deswegen sind Testzahl und Positivrate „eckig“.

Mit diesen Informationen lässt sich der Zusammenhang zwischen Infektionszahl und Testzahl betrachten. Der hypothetische Extremfall ist folgender: „Die Infektionszahl hängt nur von der Anzahl der Tests ab.“

Diese Hypothese lässt sich mit den Daten prüfen. Prüfen heißt im wissenschaftlichen Sinn, die Hypothese versuchen mit Daten zu widerlegen (Falsifikationsprinzip). Dabei helfen die Daten von Juli 2020 bis Ende September 2020:

Veränderung der Testzahl ohne Effekt auf Infektionszahl

Was hier klar zu sehen ist, ist ein massiver Anstieg der Testzahlen, wohingegen bei der Anzahl der Infektionen und der Positivrate wenig passiert. Hinge die Zahl der Infektionen, nur vor der Zahl der Tests ab, müsste die Zahl der Infektionen parallel zur Zahl der Tests steigen. Das tut sie nicht. Also ist die Aussage“Die Infektionszahl hängt nur von der Anzahl der Tests ab.“ widerlegt.

Es ist von immenser Bedeutung zu verstehen, dass mit dieser Prüfung nur widerlegt wurde, dass die Testzahl der einzige Faktor ist, der die Infektionszahl beeinflusst. Er zeigt, dass es noch andere Faktoren geben muss, die die berichtete Infektionszahl beeinflussen, allen voran (aber nicht ausschließlich!) das Infektionsgeschehen. (Für Statistik-Interessierte: Stichwort aufgeklärte Varianz)

Es gibt klare Effekte von Testzahl und berichteter Infektionszahl. Diese zeigen sich in den Daten von Oktober 2020 bis Februar 2021.

Effekte von Testzahlen auf Infektionszahlen

Zunächst ist der beige Bereich spannend. (Fun Fact: Die Farbe heißt in R „floralweiß“) Dieser Bereich deckt Mitte Oktober bis Mitte Dezember und somit auch den „Lockdown Light“ im November sowie dessen Verschärfung Ende Dezember ab. Wichtig sind drei Zusammenhänge:
  • Im Oktober steigt die Zahl der Tests stark, gleichzeitig steigt die Zahl der Infektionen sehr schnell -> Die Steigerung der Testzahl führt zu einer (leichten) Überschätzung der tatsächlichen Infektionsdynamik
  • Anfang November sinkt die Zahl der Tests, die Infektionszahlen stagnieren -> Die Reduzierung der Testzahl führt zu einer Unterschätzung der tatsächlichen Infektionsdynamik
  • Ab Dezember steigen die Testzahlen wieder, die Infektionszahlen steigen auch-> Die Verschärfung des Lockdowns ist die logische Konsequenz, weil im gesamten November die tatsächliche Infektionsdynamik unterschätzt und damit die Effektivität des „Lockdown Light“ überschätzt wurde

Interessant ist, dass die Schwankungen bei der Positivrate deutlich geringer sind. Sie steigt im gesamten Zeitraum einfach an.

Der grünlich markierte Bereich um Weihnachten zeigt einen ähnlichen Effekt. Aufgrund der Feiertage wurde weniger getestet (auch Labore machen Urlaub). Die berichtete Infektionszahl ging sprunghaft zurück. Gleichzeitig erreicht die Positivrate ihr absolutes Maximum.

Gesamthaft betrachtet legen diese Daten nahe, dass die Infektionszahl (und damit der Inzidenzwert) anfällig für Schwankungen der Testzahlen sind. Inzidenz und Infektionszahl (alleine) sind damit nur begrenzt geeignet, um die Infektionsdynamik zu überwachen und steuernde Maßnahmen zu ergreifen.

Die Positivrate scheint anhand dieser Daten ein besserer Indikator für den Infektionsverlauf zu sein. Sie ist von den Schwankungen der Testzahlen im Beispiel relativ unabhängig. Aber auch die Positivrate ist beeinflussbar, insbesondere sobald man nicht auf den Bundesschnitt, sondern auch auf das lokale Geschehen schaut. Daher ist es am sinnvollsten Positivrate und Infektionszahl immer gemeinsam zu betrachten und zu kommunizieren, um einen möglichst klaren Blick auf das Infektionsgeschehen zu erhalten.

Kennzahlen zur weiteren Steuerung

Zusätzlich zur Verwendung von Positivrate und Infektionszahl, ist es sinnvoll noch weitere Variablen zur Bewertung der Lage heranzuziehen. Um ein möglichst umfangreiches Bild, mit möglichst wenig Aufwand zu erzeugen, eignet sich aus meiner Sicht eine Kombination von drei Zahlen die auch verschiedenen Ursprungs sind:

  • Positivrate der Tests geliefert von Laboren (unter der Annahme eine halbwegs stabilen Teststrategie)
  • Die Zahl der Patienten auf Intensivstationen geliefert von den Krankenhäusern
  • Die Zahl der Tode geliefert von den Gesundheitsämtern

Das entsprechende Bild sieht so aus:

Die Linien verlaufen größtenteils parallel, was ein guter Indikator ist, dass sie tatsächlich das Gleiche messen. Die Hypothese, dass sie das Infektionsgeschehen abbilden, würde ich derzeit beibehalten.

Spannend ist der Verlauf der Daten ab Februar 2021. Die Linien laufen auseinander: Die Todeszahl bleibt gering, sinkt sogar, während Positivrate und COVID-19 Patientenzahl steigt. Meine wackelige, auf Hoffnung bauende Hypothese ist, dass dieser Effekt durch Impfungen ermöglicht wird: „Impfungen schützen vor schweren COVID-19 Verläufen und führen so zu weniger Toten, trotz weiterhin hoher Infektionsdynamik.“

Dieser Hypothese widerspricht jedoch der Anstieg der COVID-19 Patienten in Intensivbehandlung. Bisher habe ich keine stichfeste Erklärung, warum die Zahl der Intensivpatienten steigt, aber die Zahl der Toten vergleichsweise niedrig ist.

Die wahrscheinlichsten Faktoren, die eine Rolle spielen könnten, sind die Verbreitung der Mutante B.1.1.7 („B.1.1.7 ist gefährlicher“) und eine möglicherweise veränderte Altersstruktur von Intensivstation-Patienten („Jüngere Patienten liegen länger auf Intensivstationen und sterben nicht“). Da ich aber weder Daten zum Anteil der Mutanten auf Intensivstationen noch zur Altersstruktur der Patienten habe, kann ich diese Hypothesen nicht prüfen.

Alternativ wäre denkbar, dass die meisten Menschen nicht auf Intensivstationen sterben, sondern zu Hause oder in Altenheimen. Dann könnte die Zahl der Toten sinken („zu Hause und im Altenheim wird dank Impfung nicht mehr an COVID-19 gestorben“), während die Zahl der Patienten auf Intensivstationen steigt. Auch hier fehlen mir verlässliche Daten um diese Vermutung zu prüfen.

Die Aufgabe von Politikern und Managern ist, anhand all dieser Informationen zu steuern. Ich glaube, dass die Politik das auch tut. Zumindest kann ich anhand dieser Daten politische Entscheidungen nachvollziehen (s.o. Verschärfung „Lockdown Light“). Leider ist die Kommunikation und Berichterstattung zu diesen Entscheidungen mit viel unnützer Information und wenig Daten bespickt. Es bleibt nötig sich selbst ein Bild zu machen – die Datengrundlage dafür ist frei verfügbar.

R Skript

„Glaube keiner Statistik, die du nicht selbst gefälscht hast“. Deswegen hier wieder die Skripte zur Bearbeitung der Daten und Erstellung der Grafiken. Die Excel mit den Testdaten musste ich lokal speichern und den ersten Reiter rauswerfen. D.h. wer das Skript ohne diesen Schritt ausführt wird Fehlermeldungen bekommen. Obwohl nicht betrachtet, sind hier auch die DIVI Daten wieder drin.

#########Libraries ############
library(dplyr)
library(pracma)
library(BBmisc)
library(plyr)
library(readxl)
library(tidyr)
library(ggplot2)
library(scales)

###########  Daten aus DIVI laden und nur die Daten für Deutschland auswählen   ##########
#Einlesen
bundesland.zeitreihe <- read.csv("https://diviexchange.blob.core.windows.net/%24web/bundesland-zeitreihe.csv")

#Filtern
divi <- filter(bundesland.zeitreihe, Bundesland == "DEUTSCHLAND")
divi_s <- divi[,-(2:3)]

max(divi$Anzahl_Meldebereiche_Erwachsene)
plot(divi$Anzahl_Meldebereiche_Erwachsene, type = "l")

#Aufräumen
names(divi_s) <- c("Datum", "covCount", "bedsUsed", "bedsFree", "reserve", "ivFree", "ivFreeCov", "sitGood", "sitMedium", "sitBad", "sitNA")
divi_s$Datum <- as.Date(divi_s$Datum)

#Moving Averages berechnen
divi_s$bedsUsed_7 <- movavg(divi_s$bedsUsed,7,"s")


############### Daten vom RKI laden, aggregieren und moving averages der letzten 7 Tage berechnen ##############
#Einlesen
rki <- read.csv("https://opendata.arcgis.com/datasets/dd4580c810204019a7b8eb3e0b329dd6_0.csv")
rki_s <- data.frame(rki$Meldedatum, rki$AnzahlFall, rki$AnzahlTodesfall, rki$AnzahlGenesen)


#Aggregieren
names(rki_s) <- c("Datum", "Infekt", "Tod", "Gesund")
rki_a <- aggregate(rki_s[,2:4], list(rki_s$Datum), FUN = sum)
names(rki_a) <- c("Datum","Infekt", "Tod", "Gesund")

#Moving Averages berechnen
Infekt_7 <- movavg(rki_a$Infekt,7,"s")
Tod_7 <- movavg(rki_a$Tod,7,"s")
Gesund_7 <- movavg(rki_a$Gesund,7,"s")

#Aufräumen
rki_c <- data.frame(rki_a, Infekt_7, Tod_7, Gesund_7)
rki_c$Datum <- as.Date(rki_c$Datum)

####### RKI Fallzahlen und DIVI Daten Mergen und Normalisieren #########

#RKi Fallzahlen und DIVI zahlen mergen und weitere Variablen bereechnen
d <- merge(rki_c, divi_s, by=c("Datum"), all.x = TRUE)
d$beds <- d$bedsFree + d$bedsUsed
d$bedsT <- d$bedsFree + d$bedsUsed + d$reserve

d$ivFree
#Normalisierung von Variablen
z <- as.data.frame(apply(d[,c("Infekt_7", "Tod_7", "covCount", "ivFree", "bedsUsed_7", "beds", "bedsT", "sitGood", "ivFreeCov")], 2, FUN = normalize, method = "range", range = c(0,1)))
z$Datum <- d$Datum
z$ivFree[z$ivFree == 0] <- NA
z$ivFreeCov[z$ivFreeCov == 0] <- NA

########## RKI Testdaten aus lokaler Excel einlesen ##########
#Einlesen und unnötige Zeilen rauswerfen
tests <- read_excel("Documents/Corona Date/Testzahlen-gesamt.xlsx")
tests <- tests[-c((nrow(tests)-(nrow(tests)-1)),nrow(tests)),]
names(tests) <- c("KW", "Zahl", "ZahlPos", "PosAnteil", "Labore")

#Datensatz bereinigen, erste und letzte Zeile entfernen, Daten normalisieren
tz <- as.data.frame(apply(tests[,c("Zahl", "ZahlPos", "PosAnteil", "Labore")], 2, FUN = normalize, method = "range", range = c(0,1)))
tz$KW <- tests$KW

######### RKI Testdaten von Wochenbericht auf Tage strecken ###################

#Vorbereitung des Datensatzes
ndays = nrow(z) # Zahl der Tage, die schon im RKI Bericht sind

td <- matrix(0, nrow = ndays, ncol = 4)
td <- as.data.frame(td)
names(td) <- c("Datum", "Zahl", "ZahlPos", "PosAnteil")

td$Datum <- z$Datum

# Wochenzahlen der Tests für jeden Tag reinschreiben
for(w in 0:(nrow(tests)-1)) {
  for(p in 0:6){
    td$Zahl[31 + (w*7) + p] <- tz$Zahl[w+1]
    td$PosAnteil[31 + (w*7) + p] <- tz$PosAnteil[w+1]
    td$ZahlPos[31 + (w*7) + p] <- tz$ZahlPos[w+1]
  }
}

#Die Tage, für die es am Ende noch keine Daten gibt großzügig rauswerfen
s <- ndays - 5
for(x in s:ndays){
  td$Zahl[x] <- NA
  td$PosAnteil[x] <- NA
  td$ZahlPos[x] <- NA
}

############ Mergen der DIVI, RKI, und Testdaten #############
total <- merge(z, td, by=c("Datum"), all.x = TRUE)

total$PosAnteil_7 <- movavg(total$PosAnteil, 7, "s")

########### Plots für Artikel zu Tests ##################
plot(total$Datum,total$Infekt_7, type="l",col="purple", main = "SARS-CoV 2 Infektionen, Tests, Positivrate", xlab = "Datum", ylab = "Normalisierte Werte - Wertebereich 0 bis 1")
lines(total$Datum,total$PosAnteil, col="magenta")
lines(total$Datum,total$Zahl, col="cyan")
legend("topleft",
       c("Infektionen", "Tests", "Positivrate"),
       fill=c("purple", "cyan", "magenta"))

#Zeitbereich komplett
t_plot <- ggplot(data= subset(total, total$Datum > "2020-03-07" & total$Datum < "2021-04-18"), aes(x=Datum)) + geom_line(aes(y = Zahl, color = "Tests")) + geom_line(aes(y = Infekt_7, color = "Infektionen")) + geom_line(aes(y = PosAnteil, color = "Positivrate"))
t_plot <- t_plot + theme_classic() + ylab("Normalisierte Werte - Wertebereich 0 bis 1") + ggtitle("Infektionen, Positivrate, Tests März 2020 bis April 2021") + theme(plot.title = element_text(hjust = 0.5), legend.title = element_blank())
t_plot <- t_plot + scale_color_manual(values=c("purple", "magenta", "cyan"))
t_plot

#Zeitbereich Juli bis Oktober
t_plot2 <- ggplot(data= subset(total, total$Datum > "2020-07-01" & total$Datum < "2020-09-30"), aes(x=Datum)) + geom_line(aes(y = Zahl, color = "Tests")) + geom_line(aes(y = Infekt_7, color = "Infektionen")) + geom_line(aes(y = PosAnteil, color = "Positivrate"))
t_plot2 <- t_plot2 + theme_classic() + ylab("Normalisierte Werte - Wertebereich 0 bis 1") + ggtitle("Infektionen, Positivrate, Tests Juli 2020 bis September 2020") + theme(plot.title = element_text(hjust = 0.5), legend.title = element_blank())
t_plot2 <- t_plot2 + scale_color_manual(values=c("purple", "magenta", "cyan"))
t_plot2

#Zeitbereich Oktober bis Februar
rect_1 <- geom_rect(aes(xmin=as.Date("2020-11-08"), xmax=as.Date("2020-12-02"), ymin=0, ymax=Inf), fill = "floralwhite", alpha = 0.1)
rect_2 <- geom_rect(aes(xmin=as.Date("2020-12-23"), xmax=as.Date("2021-01-09"), ymin=0, ymax=Inf), fill = "honeydew", alpha = 0.1)

t_plot3 <- ggplot(data= subset(total, total$Datum > "2020-10-01" & total$Datum < "2021-02-01"), aes(x=Datum)) + rect_1 + rect_2 + geom_line(aes(y = Zahl, color = "Tests")) + geom_line(aes(y = Infekt_7, color = "Infektionen")) + geom_line(aes(y = PosAnteil, color = "Positivrate"))
t_plot3 <- t_plot3 + theme_classic() + ylab("Normalisierte Werte - Wertebereich 0 bis 1") + ggtitle("Infektionen, Positivrate, Tests Oktober 2020 bis Februar 2021") + theme(plot.title = element_text(hjust = 0.5), legend.title = element_blank())
t_plot3 <- t_plot3 + scale_color_manual(values=c("purple", "magenta", "cyan")) 
t_plot3

#Tode, Positivanteil, COVID-19 Patienten etc.
d_plot <- ggplot(data= subset(total, total$Datum > "2020-03-07" & total$Datum < "2021-04-18"), aes(x=Datum)) + rect_1 + rect_2 + geom_line(aes(y = PosAnteil, color = "Positivrate")) + geom_line(aes(y = Tod_7, color = "Tode")) + geom_line(aes(y = covCount, color = "COVID-19 Patienten")) 
d_plot <- d_plot + theme_classic() + ylab("Normalisierte Werte - Wertebereich 0 bis 1") + ggtitle("COVID-19 Patienten, Positivrate, Tode März 2020 bis April 2021") + theme(plot.title = element_text(hjust = 0.5), legend.title = element_blank())
d_plot <- d_plot + scale_color_manual(values=c("red", "magenta", "black")) 
d_plot 

COVID-19: Daten zur Lage der Intensivstationen

In verschiedenen Zeitungen und von Politikern lese ich in den letzten Tagen häufig dringliche Appelle oder angespannte Diskussionen zur Lage von Intensivstationen und der Notwendigkeit eines harten Lockdowns.

Leider wird die Dringlichkeit eines Lockdowns und der Ernst der Lage an den Intensivstationen entweder gar nicht mit Daten, dem Verweis auf die tagesaktuellen Daten oder mit Erfahrungsberichten aus einzelnen Kliniken begründet.

Auf der Suche nach Daten, die mir helfen, die Dynamik an den Intensivstationen besser zu verstehen, habe ich wie im letzten Artikel wieder mit R herumgespielt und mir verfügbare Datenquellen angeschaut:

Im Prinzip gibt es dabei drei Bausteine, aus denen ich mir erklären kann, warum Intensivmediziner dringlich einen Lockdown fordern und die mir helfen, die teils aufgeregte mediale Berichterstattung ruhig ud sachlich einzuordnen.

  1. Die Belastung der Intensivstationen ist bereits sehr hoch
  2. Die Prognose für die nächsten Wochen ist, dass die Belastung ansteigt
  3. Die Angst vor möglichen Triage Entscheidungen ist sehr groß

Aktuelle Belastung der Intensivstationen: Regelbetrieb & verfügbare invasive Beatmungseinheiten

Wie sehr Intensivstationen derzeit im Vergleich zu früheren Monaten belastet sind, verdeutlichen die absoluten, tagesaktuellen Zahlen von Patienten auf Intensivstationen leider nur schlecht. Die Entwicklung der letzten Monate lässt sich am besten durch den Anteil der Intensivstationen, die im Regelbetrieb arbeiten und die noch verfügbaren Einheiten für invasive Beatmung veranschaulichen:

Die Zahlen sind hier wieder normalisiert, zur Vergleichbarkeit also auf den Wertebereich 0 – 1 transformiert. Besorgniserregend ist, dass die Zahl der Intensivstationen mit regulärem Betrieb und die Zahl verfügbarer Beatmungseinheiten jetzt bereits niedriger ist, als zum Höhepunkt der zweiten Welle. Die aktuelle dritte Welle hat ihren Höhepunkt aber noch nicht erreicht, weder bei der Zahl der Infektionen noch bei der Zahl der COVID-19 Patienten in intensivmedizinischer Behandlung.

Hier ist auch der Blick auf die absoluten Zahlen interessant. Die normalisierte Darstellung erlaubt nur den Vergleich der Entwicklung der Linien, aber nicht den Vergleich der absoluten Höhe der Linien. Das ist in folgender Darstellung möglich:

Hinweis: Im DIVI Datensatz befindet sich auch die Angabe, wie viele der Beatmungseinheiten für COVID-19 Patienten reserviert sind. Am 13.04. sind das 1101 von 2622 Einheiten. Zur Vereinfachung habe ich diese Linie in der Grafik weggelassen. Die Grafik findet sich am Ende des Artikels im Skriptbereich.

Was zumindest mir anhand dieser Daten verständlich wird, ist, dass derzeit ein hohes Belastungsniveau an Intensivstationen herrscht. Das wirft die Frage auf: Wie wird sich das über die nächsten Wochen entwickeln?

DIVI Prognose zur Auslastung der nächsten Wochen

Vom DIVI wird auch eine Prognose zur Verfügung gestellt, wie sich die Zahl der Patienten über die nächsten Wochen entwickeln wird. Den Link habe ich oben geteilt, die Abbildung dazu ist folgende:

Wenn Ende dieser Woche (Inzidenz 200) ein harter Lockdown durchgesetzt wird, erwartet DIVI die orange Linie. Wenn erst Ende April (Inzidenz 300) ein harter Lockdown beschlossen wird, läuft es auf die rote Linie hinaus.Das wären dann rund 6.800 COVID-19 Patienten in Intensivbehandlung. Was das für die Auslastung der Intensivstationen bedeutet lässt sich leicht ausrechnen:

  • Zur Erinnerung: Aktuell sind noch 1101 Beatmungseinheiten für COVID-19 Patienten bzw. 2622 Einheiten insgesamt verfügbar
  • Stand heute (14.04.) sind 4653 COVID-19 Patienten in intensivmedizinischer Behandlung, von denen knapp 57% invasiv beatmet werden. Siehe: https://www.intensivregister.de/#/aktuelle-lage/laendertabelle
  • Der erwartete Höchststand sind 6800 Patienten, also 2147 zusätzliche Patience, was bei 57% Beatmungsquote ca. 1223 Patienten ergibt, die invasiv beatmet werden müssten

1223 zusätzliche COVID-19 Patienten übersteigt die verfügbare Kapazität von 1101. Das ist nur der theoretische Wert, der noch nicht in Betracht zieht, dass es große lokale Unterschiede in Fallzahlen und verfügbaren Betten geben wird. Die tatsächliche Lücke wäre also größer.

Diese Prognose legt nahe, dass Menschen nicht beatmet werden könnten, obwohl es medizinisch nötig wäre. Es müsste dann eine Entscheidung getroffen werden, wer beatmet wird und wer nicht. An dieser Stelle tritt das Schreckenswort Triage auf.

Das Problem der harten Priorisierung: Triage

Triage wurde mir mal so erklärt:

In absoluten Notsituationen z.B. bei tausenden Kriegsverletzten nach verheerenden Schlachten mussten Mediziner wie folgt priorisieren:

  1. Behandle den nicht, der auch ohne deine Hilfe überlebt
  2. Behandle den nicht, der auch mit deiner Hilfe stirbt
  3. Behandle nur den, der ohne deine Hilfe stirbt, aber mit deiner Hilfe überlebt

Diese Priorisierung ist die sinnvollste unter grausamen Bedingungen. Die aktuelle Situation ist glücklicherweise nicht ganz so grausam. Dennoch findet bereits eine gewisse Priorisierung statt, wer intensivmedizinisch behandelt wird und wer nicht. Das braucht einen kleinen Umweg und lässt sich nur indirekt an Daten ablesen. Es lässt sich aber an der Zahl der belegten Betten von Intensivstationen erklären, die ich auch im letzten Artikel gezeigt hatte:

Ich hatte mich gewundert, dass die orange Linie (belegte Betten) konstant bleibt, während die rote Linie (COVID-19 Patienten) steigt. Die Antwort ist relativ einfach: Es findet bereits aktive Steuerung und Priorisierung durch Kliniken statt, sonst wäre die Konstanz der Anzahl belegter Betten nicht möglich.

Die Logik der Steuerung folgt vermutlich dem ersten Schritt der Triage, wie ich sie oben skizziert habe: „Behandle den nicht, der auch ohne deine Hilfe überlebt“. Planbare Eingriffe wie z.B. Knie- oder Hüftprothesen werden verschoben um Kapazitäten für akute Fälle zu schaffen.

Es ist offensichtlich, dass diese Art der Priorisierung nur solange durchgeführt werden kann, wie es planbare und verschiebbare Eingriffe gibt. Mit den prognostizierten Zahlen für neue COVID-19 Patienten dürfte diese Zahl bald gegen 0 gehen und der zweite Schritt nötig werden: „Behandle den nicht, der auch mit deiner Hilfe stirbt“

Es ist sehr verständlich, dass eine solche Situation vermieden werden soll, denn diese Priorisierung ist unendlich quälend:

  • Vorherzusagen, wer auch mit Behandlung stirbt und wer nicht, ist kaum möglich
  • Menschen nicht zu behandeln widerspricht dem Selbstverständnis von Ärzten
  • Patienten und Angehörige würden eine „Nicht-Behandlung“ kaum hinnehmen
  • Kliniken dürften juristische Klagen erwarten

Persönliche Schlussgedanken

Anhand der vorliegenden Daten verstehe ich die Dringlichkeit und Not, mit der manche Politiker und Intensivmediziner für einen harten Lockdown eintreten – als scheinbar einzige Möglichkeit, die furchtbaren Prognosen und Zwänge abzuwenden, die Tageslage und Prognose nahelegen.

Was mich wundert und durchaus frustriert, ist die scheinbare Alternativlosigkeit von Lockdowns und die weiterhin geringe Beachtung der Auswirkungen auf andere Bereiche gesellschaftlichen und persönlichen Lebens. Nach über einem Jahr Pandemie und Lernen über das Virus, hätte ich mir mehr Mut und Kreativität zur Lösungsfindung erhofft.

R Skripts zur Erstellung der Grafiken und Auswertung der Daten

Ich möchte auch wieder die Skripte teilen, mit denen ich Grafiken erstellt habe, um Daten und Darstellung nachvollziehbar zu machen. Das Skript enthält mehr Daten und Befehle, als für die Erstellung der Plots nötig ist, weil ich bei meiner Spielerei nicht der Nutzbarkeit für andere sondern meiner Neugier gefolgt bin. 🙂

Ales erstes noch die Grafik mit den für COVID-19 Patienten reservierten Beatmungseinheiten

#########Libraries ############
library(dplyr)
library(pracma)
library(BBmisc)
library(plyr)
library(readxl)
library(tidyr)
library(ggplot2)
library(scales)

###########  Daten aus DIVI laden und nur die Daten für Deutschland auswählen   ##########
#Einlesen
bundesland.zeitreihe <- read.csv("https://diviexchange.blob.core.windows.net/%24web/bundesland-zeitreihe.csv")

#Filtern
divi <- filter(bundesland.zeitreihe, Bundesland == "DEUTSCHLAND")
divi_s <- divi[,-(2:3)]

#Aufräumen
names(divi_s) <- c("Datum", "covCount", "bedsUsed", "bedsFree", "reserve", "ivFree", "ivFreeCov", "sitGood", "sitMedium", "sitBad", "sitNA")
divi_s$Datum <- as.Date(divi_s$Datum)

#Moving Averages berechnen
divi_s$bedsUsed_7 <- movavg(divi_s$bedsUsed,7,"s")


############### Daten vom RKI laden, aggregieren und moving averages der letzten 7 Tage berechnen ##############
#Einlesen
rki <- read.csv("https://opendata.arcgis.com/datasets/dd4580c810204019a7b8eb3e0b329dd6_0.csv")
rki_s <- data.frame(rki$Meldedatum, rki$AnzahlFall, rki$AnzahlTodesfall, rki$AnzahlGenesen)

#Aggregieren
names(rki_s) <- c("Datum", "Infekt", "Tod", "Gesund")
rki_a <- aggregate(rki_s[,2:4], list(rki_s$Datum), FUN = sum)
names(rki_a) <- c("Datum","Infekt", "Tod", "Gesund")

#Moving Averages berechnen
Infekt_7 <- movavg(rki_a$Infekt,7,"s")
Tod_7 <- movavg(rki_a$Tod,7,"s")
Gesund_7 <- movavg(rki_a$Gesund,7,"s")

#Aufräumen
rki_c <- data.frame(rki_a, Infekt_7, Tod_7, Gesund_7)
rki_c$Datum <- as.Date(rki_c$Datum)

####### RKI Fallzahlen und DIVI Daten Mergen und Normalisieren #########

#RKi Fallzahlen und DIVI zahlen mergen und weitere Variablen bereechnen
d <- merge(rki_c, divi_s, by=c("Datum"), all.x = TRUE)
d$beds <- d$bedsFree + d$bedsUsed
d$bedsT <- d$bedsFree + d$bedsUsed + d$reserve

d$ivFree
#Normalisierung von Variablen
z <- as.data.frame(apply(d[,c("Infekt_7", "Tod_7", "covCount", "ivFree", "bedsUsed_7", "beds", "bedsT", "sitGood", "ivFreeCov")], 2, FUN = normalize, method = "range", range = c(0,1)))
z$Datum <- d$Datum
z$ivFree[z$ivFree == 0] <- NA
z$ivFreeCov[z$ivFreeCov == 0] <- NA

########## Plots für ersten Artikel vom 11.04.2020 #############

#Ausslastung der Intensivstationen 1
plot(d$Datum,d$beds,type="l",col="green", main = "Auslastung Intesivstationen 1", xlab = "Datum", ylab = "Betten")
lines(d$Datum,d$covCount, col ="red")
lines(d$Datum,d$bedsUsed,col="orange")
legend("topleft",
       c("Gesamtzahl Betten","Belegte Betten", "COV-19 Patienten"),
       fill=c("green","orange", "red"))

######### Plots zur Lage auf den Intensivstationen #################

#Lage auf den Intensivsstationen
plot(z$Datum,z$sitGood,type="l",col="blue", main = "Lage der Intensivstationen", xlab = "Datum", ylab = "Normalisierte Werte - Wertebereich 0 bis 1")
lines(z$Datum,z$covCount, col ="red")
lines(z$Datum,z$ivFree, col = "bisque4")
legend("topleft",
       c("COVID-19 Patienten", "Intensiv Regelbetrieb", "Freie Beatmungseinheiten"),
       fill=c( "red", "blue", "bisque4"))

#COVID Patienten vs. Beatmungskapazitäten
plot(d$Datum,d$ivFree,type="l",col="bisque4", main = "COVID Patienten vs. Beatmungskapazitäten", xlab = "Datum", ylab = "Zahl")
lines(d$Datum,d$covCount, col = "red")
legend("topleft",
       c("COVID-19 Patienten", "Freie Beatmungseinheiten"),
       fill=c("red", "bisque4"))

#COVID Patienten vs. Beatmungskapazitäten mit CoVID 19 frei
plot(d$Datum,d$ivFree,type="l",col="bisque4", main = "COVID Patienten vs. Beatmungskapazitäten", xlab = "Datum", ylab = "Zahl")
lines(d$Datum,d$covCount, col = "red")
lines(d$Datum,d$ivFreeCov, col = "darkgoldenrod4")
legend("topleft",
       c("COVID-19 Patienten", "Freie Beatmungseinheiten", "Freie Einheiten COVID-19"),
       fill=c("red", "bisque4", "darkgoldenrod4"))

COVID-19: Die aktuelle Lage mit Bildern aus Daten

Letzten Freitag habe ich mehrer Schlagzeilen in Zeitungen gelesen, die ungefähr so klangen: „So viele Patienten wie noch nie auf deutschen Intensivstationen.“ Das verwunderte mich etwas und machte mich neugierig.

Für mich ein Grund mal wieder R Studio aufzumachen, ein wenig mit Daten zu spielen, sie aufzubereiten und Grundlage für eigene Gedankengänge zu schaffen. Ich möchte die Ergebnisse meiner Spielerei hier teilen, so dass auch andere die freie zugänglichen Daten interpretieren und ihre Schlüsse daraus ziehen können.

Statt auf Basis der Daten Antworten zu geben, möchte ich eher die Fragen stellen, die sich bei mir beim Betrachten der Daten stellen. Das ist vor allem auch der Versuch sachliche Diskussionen fern von individuellen Ängsten, Ideologie und Extremen zu ermöglichen. Eine klare Einschätzung der Lage braucht fundierte Datenbasis und weiten Horizont, um das Ganze zu sehen.

Alle Bilder, die ich gemalt habe und unten teile, basieren auf Daten des RKI und DIVI, insbesondere:

Es ist erfreulich, dass diese Daten erfasst und allen frei zur Verfügung gestellt werden. Was ich seit Monaten bedaure ist der Umgang mit diesen Daten. Sie werden automatisiert in bunten Dashboards dargestellt und tagesaktuell in Zeitungen berichtet. Sie werden leider selten so aufbereitet, dass sie anschaulich oder sinnvoll interpretierbar sind. Hier möchte ich helfen und werde am Ende dieses Beitrags den R Studio Code teilen, mit dem ich die Grafiken generiert habe.

Auslastung der Intensivstationen (ohne Reserve)

Da es der Aufhänger für diesen Artikel war, möchte ich als erstes eine Grafik zur Auslastung der Intensivstationen teilen, die so ähnlich auch auf der DIVI-Seite zugänglich ist.

Ich hoffe die Bezeichnung der Linien ist selbsterklärend als Interpretationshilfe noch einige Anmerkungen:

  • Das DIVI-Register wurde nach meinem Wissensstand im März / April 2020 aufgebaut, daher der steile Anstieg der grünen (Gesamtzahl Betten) und orangenen (Belegte Betten) Linien
  • Die Differenz zwischen grüner und oranger Linie gibt an, wie viele freie Betten es gibt
  • Die Differenz zwischen oranger und roter Linie gibt an, wie viele Patienten auf einer Intensivstation behandelt werden, die nicht an COVID-19 erkrankt sind (bzw. positiv auf SARS-CoV 2 getestet wurden)

Beim betrachten der Grafik drängen sich mir zwei Fragen auf:

  • Wieso nimmt die Gesamtzahl der verfügbaren Intensivbetten seit Mitte 2020 kontinuierlich ab?
  • Wie steuern die Kliniken die Auslastung ihrer Intensivbetten, dass. die wechselnde Zahl von COVID-19 Patienten (rote Linie) keine sichtbaren Auswirkungen auf die Anzahl der belegten Betten hat (orange Linie)?

Für beide Fragen gibt es sicher plausible und nachvollziehbare Antworten. Ich kenne sie nur nicht und bin dankbar für jeden Hinweis oder Erklärung.

Auslastung der Intensivstationen (mit Reserve)

Ein Teilantwort auf die erste Frage (Rückgang der Intensivbetten) ist, dass eine Notfallreserve geschaffen wurde. addiert man diese, innerhalb einer Woche verfügbaren Betten, zur Gesamtzahl der verfügbaren Betten verändert sich das Bild wie folgt:

Der Rückgang der Gesamtzahl der Intensivbetten ist immer noch sichtbar. Vergleicht man die Zahl der belegten Betten (orange) mit der Zahl der gesamthaft verfügbaren Betten (grün) scheint es, als gäbe es noch ausreichend verfügbare Betten. Fragen, die sich mir stellen:

  • Unter welchen Umständen würde die Notfallreserve abgerufen werden?
  • Welche Konsequenzen und Nebenwirkungen hätte das Aktivieren der Notfallreserve?

Auslastung der Intensivstationen (Regelbetrieb)

Auf Basis der obigen Grafiken liegt die Interpretation nahe, dass „die deutschen Intensivstationen nicht überlastet sind“. Dennoch wird in Zeitschriften und von Politikern häufig darüber gesprochen, dass Kliniken und Intensivstationen überlastet sind. Erfreulicherweise stellt das DIVI auch Daten dazu bereit, wie viele Intensivstationen im Regelbetrieb laufen und wie viele Intensivstationen mit Einschränkungen (z.B. wegen fehlendem Material oder Personalmangel) nur eingeschränkt funktionieren.

Die nächste Grafik bildet genau diese Daten ab. Um die Grafik etwas leichter verständlich zu machen, habe ich die Daten jedoch normalisiert. Das bedeutet, die Datenpunkte jeder betrachteten Variable wurden auf Werte zwischen 0 und 1 umgerechnet. Dadurch kann die dynamische Entwicklung der Variablen besser veranschaulicht werden:

Vergleicht man diese Grafik mit der vorherigen, so bleiben die. Form der orangen Linie (belegte Betten) und der roten Linie (COVID-19) gleich, jedoch hat sich die Skalierung verändert. Hier kann nur noch der komplette Verlauf der Linien, aber nicht mehr einzelne Datenpunkte miteinander verglichen werden. Zwei Interpretationen scheinen naheliegend.
  • Die Anzahl der belegten Betten wird nicht von der Anzahl von COVID-19 Patienten beeinflusst und beeinflusst auch nicht, wie viele Intensivstationen im Regelbetrieb arbeiten (blaue Linie)
  • Desto mehr COVID-19 Patienten auf Intensivstationen behandelt werden, desto weniger Intensivstationen können im Regelbetrieb arbeiten

Die Fragen, die hier gestellt und beantwortet werden sollten sind aus meiner Sicht folgende:

  • Welche (weiteren) Faktoren (neben COVID-19 Patienten) führen dazu, dass immer weniger Intensivstationen im Regelbetrieb arbeiten können?
  • Welche Maßnahmen (neben harten Lockdowns) könnten ergriffen werden, um wieder auf mehr Intensivstationen Regelbetrieb zu ermöglichen?

Infektionen, Intensivpatienten, Tote

Die Zahlen, die am häufigsten in Zeitungen, auf Website und in Dashboards berichtet und visualisiert werden, sind die Anzahl der täglich berichteten Neuinfektionen, die Zahl der COVID-19 Patienten auf Intensivstationen und die Zahl der Menschen, die mit oder COVID-19 gestorben sind. Leider werden diese Zählen häufig nicht in einer Grafik sondern als verschiedene Zeitreihen dargestellt. Dadurch ist die Dynamik und der Zusammenhang der Variablen schwer zu erkennen. Das lässt sich leicht ändern:

Die Zahl der Infektionen und die Zahl der Toten schwanken abhängig vom Wochentag sehr systematisch. Um diese Schwankungen zu glätten, habe ich wie die meisten Zeitungen auch einen 7-Tage-Mittelwert berechnet und abgebildet. Die Form der lila Kurve dürfte bekannt erscheinen.

Interessant sind in dieser Grafik vor allem die Relationen zwischen den einzelnen Linien. Über die Dynamik des Geschehens lässt sich leider wenig aussagen. Dazu hilft aber wieder die Normalisierung der Daten.

Infektionen & Intensivpatienten (normalisierte Daten)

Um einfacher vergleichen zu können, zeige ich obige Daten auch wieder normalisiert. Zunächst den Zusammenhang zwischen registrierten Neuinfektionen und Intensivpatienten mit COVID-19:

Die Grafik wirft für mich keine drängenden Fragen auf, liefert jedoch zwei Erkenntnisse bzw. Plausibilisierungen:

  • Die rote Linie (COVID-19 Patienten auf Intensivstationen) steigt rund eine Woche später als die Neuinfektionen an -> das ist plausibel, wenn mann annimmt, dass es erst einige Tage nach Feststellen der Infektion eine Behandlung auf der Intensivstation nötig ist
  • Wenn die Zahl der Neuinfektionen (lila Linie) sinkt, sinken etwas später auch die COVID-19 Patienten auf Intensivstationen, der Zeitversatz ist jedoch größer als beim Anstiegen der Infektionen -> das ist plausibel, wenn man annimmt, dass Intensivpatienten länger als 1 Woche auf Intensivstationen behandelt werden.

Infektionen & Tote (normalisierte Daten)

Zu guter Letzt kommt hier auch die normalisierte Darstellung von Infektionszahlen und Todeszahlen. Diese Darstellung halte ich für besonders wertvoll, weil bei einer Fallsterblichkeit von 1-2% die Skalierung von Todeszahlen und Infektionen sehr unterschiedlich und damit kaum vergleichbar ist. Die Normalisierung ändert das:

Die beiden Linien laufen größtenteils parallel, was auch zu erwarten ist, da natürlich umso mehr Menschen an oder mit COVID-19 sterben, je mehr Menschen sich mit dem Virus infizieren. Zwei Interessante Stellen sind in der Grafik zu erkennen
  • Im Jahr 2020 während der ersten Welle gab es verhältnismäßig mehr Tote als berichtete Neuinfektionen. Das ist einfach nur ein Hinweis auf die relativ hohe Dunkelziffer an Infektionen während der ersten Welle
  • Seite Februar 2021 laufen die beiden Linien auseinander. Die naheliegende Erklärung dafür ist der Beginn der Impfkampagne und die Wirksamkeit des COVID-19 Impfstoffs

In diesem Bild steckt vor allem die gute Nachricht: Die Impfung wirkt und das lässt sich an Zahlen plausibilisieren.

Für mich wirft dieses Grafik aber auch drängende, politische Fragen auf:

  • Wenn die Impfung wirkt, und immer weniger Menschen, die sich mit SARS-CoV 2 infizieren sterben, welchen Mehrwert bietet die Verfolgung von Infektionszahlen und die Steuerung von Maßnahmen mit daraus abgeleiteten Inzidenzwerten?
  • Welche Kennzahlen und Ansätze sind geeignet, um eine vernünftige Lockerung der bestehenden Maßnahmen zu ermöglichen, ohne das Gesundheitssystem zu überlasten?
  • Welchen Sinn hat vor dem Hintergrund dieser Datenlage eine Ausweitung der Befugnisse des Bundes mit den diskutierten Änderungen des Infektionsschutzgesetzes?

Anmerkungen zur Interpretation

Es ist mir wichtig meine Bilder noch ein wenig einzuordnen. Diese Darstellung erfolgt auf sehr hoher Flughöhe. In den Daten sind Details und Abweichungen enthalten, die die Interpretationsmöglichkeiten der Daten beeinfluss, die ich jedoch nicht berücksichtigt habe. Das sind beispielsweise vermittelnde Variablen (z.B. Anzahl der Corona-Tests), Änderungen nan der Erhebungsmethode (Falldefinition, Gesetzesänderungen) oder schlicht Unsauberkeiten in den Daten (Todes- und Infektionsdatum stimmen überein).

Alles, was ich schreibe ist keine streng wissenschaftliche Untersuchung, sondern der Versuch frei verfügbare Daten so aufzubereiten, dass mehr Menschen die aktuelle Lage fundiert, sachlich und ohne Panikmache oder unnötige Übertreibung beurteilen können.

Verwendete Skripts und Software

Um transparent zu machen, wie die Grafiken erstellt wurden, teile ich hier auch Links zu R und den von mir generierten Code. Ich bin alles andere als ein Experte in R, deswegen ist der Code an vielen Stellen vermutlich wenig elegant oder unübersichtlich. Er tut jedoch was er soll. Einzige Unsicherheit ist, ob der Abruf der Daten von den Webseiten des RKI bzw. DIVI auch in einigen Tagen noch funktioniert, falls sich die URL der Dateien ändert.

Quellcode:

install.packages("dplyr")
install.packages("pracma")
install.packages("BBmisc")
library(dplyr)
library(pracma)
library(BBmisc)

###########################################################################################
#Daten aus DIVI laden und nur die Daten für Deutschland auswählen
bundesland.zeitreihe <- read.csv("https://diviexchange.blob.core.windows.net/%24web/bundesland-zeitreihe.csv")
divi <- filter(bundesland.zeitreihe, Bundesland == "DEUTSCHLAND")
divi_s <- divi[,-(2:3)]
names(divi_s) <- c("Datum", "covCount", "bedsUsed", "bedsFree", "reserve", "ivFree", "ivFreeCov", "sitGood", "sitMedium", "sitBad", "sitNA")
divi_s$Datum <- as.Date(divi_s$Datum)

###########################################################################################
#Daten vom RKI laden, aggregieren und moving averages der letzten 7 Tage berechnen
rki <- read.csv("https://opendata.arcgis.com/datasets/dd4580c810204019a7b8eb3e0b329dd6_0.csv")
rki_s <- data.frame(rki$Meldedatum, rki$AnzahlFall, rki$AnzahlTodesfall, rki$AnzahlGenesen)
names(rki_s) <- c("Datum", "Infekt", "Tod", "Gesund")
rki_a <- aggregate(rki_s[,2:4], list(rki_s$Datum), FUN = sum)
names(rki_a) <- c("Datum","Infekt", "Tod", "Gesund")
Infekt_7 <- movavg(rki_a$Infekt,7,"s")
Tod_7 <- movavg(rki_a$Tod,7,"s")
Gesund_7 <- movavg(rki_a$Gesund,7,"s")
rki_c <- data.frame(rki_a, Infekt_7, Tod_7, Gesund_7)
rki_c$Datum <- as.Date(rki_c$Datum)

###########################################################################################
#Tables mergen in gesamten Datensatz 
d <- merge(rki_c, divi_s, by=c("Datum"), all.x = TRUE)
d$beds <- d$bedsFree + d$bedsUsed
d$bedsT <- d$bedsFree + d$bedsUsed + d$reserve

#Ausslastung der Intensivstationen 
plot(d$Datum,d$beds,type="l",col="green", main = "Auslastung Intesivstationen 1", xlab = "Datum", ylab = "Betten")
  lines(d$Datum,d$covCount, col ="red")
  lines(d$Datum,d$bedsUsed,col="orange")
  legend("topleft",
       c("Gesamtzahl Betten","Belegte Betten", "COV-19 Patienten"),
       fill=c("green","orange", "red"))


#Ausslastung der Intensivstationen mit der Reserve als Vergleichslinie
plot(d$Datum,d$bedsT,type="l",col="green", main = "Auslastung Intesivstationen 2", xlab = "Datum", ylab = "Betten")
  lines(d$Datum,d$covCount, col ="red")
  lines(d$Datum,d$bedsUsed,col="orange")
  legend("topleft",
         c("Gesamtzahl Betten + Reserve","Belegte Betten", "COV-19 Patienten"),
         fill=c("green","orange", "red"))
  
  
###########################################################################################
#standardisierung von aussgewählte Variablen zum Vergleich der Zahlen
z <- data.frame(d$Datum, d$Infekt_7, d$Tod_7, d$covCount, d$ivFree, d$bedsUsed, d$beds, d$bedsT, d$sitGood)
names(z) <- c("Datum", "Infekt_7", "Tod_7", "covCount", "ivFree", "bedsUsed", "beds", "bedsT", "sitGood")
z$Infekt_7 <- normalize(z$Infekt_7, method = "range", range = c(0,1))
z$Tod_7 <- normalize(z$Tod_7, method = "range", range = c(0,1))
z$covCount <- normalize(z$covCount, method = "range", range = c(0,1))
z$ivFree <- normalize(z$ivFree, method = "range", range = c(0,1))
z$bedsUsed <- normalize(z$bedsUsed, method = "range", range = c(0,1))
z$beds <- normalize(z$beds, method = "range", range = c(0,1))
z$bedsT <- normalize(z$bedsT, method = "range", range = c(0,1))
z$sitGood <- normalize(z$sitGood, method = "range", range = c(0,1))

###########################################################################################
#Auslastung Intensivstationen + Zahl der Intensivstationen mit regulärem Betrieb
plot(z$Datum,z$sitGood,type="l",col="blue", main = "Intensivstationen im Regelbetrieb", xlab = "Datum", ylab = "Normalisierte Werte - Wertebereich 0 bis 1")
lines(z$Datum,z$covCount, col ="red")
lines(z$Datum,z$bedsUsed,col="orange")
legend("topleft",
       c("Intensiv Regelbetrieb","Belegte Betten", "COVID-19 Patienten"),
       fill=c("blue","orange", "red"))


#Fälle, Intensivpatienten, Tote
plot(d$Datum,d$Infekt_7,type="l",col="purple", main = "SARS-CoV 2 Infektionen & COVID-19 Fälle", xlab = "Datum", ylab = "Menschen")
lines(d$Datum,d$covCount, col ="red")
lines(d$Datum,d$Tod_7, col="black")
legend("topleft",
       c("Infektionen mit SARS-CoV 2","COVID-19 Intensivpatienten", "Tote mit COV-19"),
       fill=c("purple","red", "black"))

#Fälle, Intensivpatienten normalisiert
plot(z$Datum,z$Infekt_7,type="l",col="purple", main = "SARS-CoV 2 Infektionen & COVID-19 Fälle", xlab = "Datum", ylab = "Normalisierte Werte - Wertebereich 0 bis 1")
lines(z$Datum,z$covCount, col ="red")
legend("topleft",
       c("Infektionen mit SARS-CoV 2","COVID-19 Intensivpatienten"),
       fill=c("purple","red"))

#Fälle, Tote normalisiert
plot(z$Datum,z$Infekt_7,type="l",col="purple", main = "SARS-CoV 2 Infektionen & COVID-19 Tote", xlab = "Datum", ylab = "Normalisierte Werte - Wertebereich 0 bis 1")
lines(z$Datum,z$Tod_7, col="black")
legend("topleft",
       c("Infektionen mit SARS-CoV 2", "Tote mit COVID-19"),
       fill=c("purple", "black"))