Hausaufgabe vom 07.11.2024

Aufgabe 1

a) Zählen Sie, wie viele Probanden in der NHANES-Tabelle größer als 190 cm sind

suppressPackageStartupMessages(library(tidyverse))

read_csv("data_on_git/nhanes.csv") -> nhanes
Rows: 8704 Columns: 6
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (2): gender, ethnicity
dbl (4): subjectId, age, height, weight

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
nhanes
# A tibble: 8,704 × 6
   subjectId gender   age height weight ethnicity  
       <dbl> <chr>  <dbl>  <dbl>  <dbl> <chr>      
 1     93703 female     2   88.6   13.7 NH Asian   
 2     93704 male       2   94.2   13.9 NH White   
 3     93705 female    66  158.    79.5 NH Black   
 4     93706 male      18  176.    66.3 NH Asian   
 5     93707 male      13  158.    45.4 Other/Mixed
 6     93708 female    66  150.    53.5 NH Asian   
 7     93709 female    75  151.    88.8 NH Black   
 8     93710 female     0   NA     10.2 NH White   
 9     93711 male      56  171.    62.1 NH Asian   
10     93712 male      18  173.    58.9 Mexican    
# ℹ 8,694 more rows
nhanes %>%
  summarise(Taller_than_sixft = sum(height > 190, na.rm=TRUE))
# A tibble: 1 × 1
  Taller_than_sixft
              <int>
1                45

b) Gruppieren Sie nach Geschlecht und Ethnie. Zählen Sie für jede Gruppe getrennt, wie viele Probanden insgesamt in der Gruppe sind, und wie viele über 190 cm groß sind.

nhanes %>%
  group_by(gender, ethnicity) %>%
  summarise(Taller_than_sixft = sum(height > 190, na.rm=TRUE))
`summarise()` has grouped output by 'gender'. You can override using the
`.groups` argument.
# A tibble: 12 × 3
# Groups:   gender [2]
   gender ethnicity      Taller_than_sixft
   <chr>  <chr>                      <int>
 1 female Mexican                        0
 2 female NH Asian                       0
 3 female NH Black                       0
 4 female NH White                       0
 5 female Other Hispanic                 0
 6 female Other/Mixed                    0
 7 male   Mexican                        1
 8 male   NH Asian                       0
 9 male   NH Black                      25
10 male   NH White                      14
11 male   Other Hispanic                 0
12 male   Other/Mixed                    5

c) Berechnen Sie für jede Gruppe den prozentualen Anteil an Über-1.9-Meter-Probanden.

nhanes %>%
  group_by(gender, ethnicity) %>%
  summarise(
    Subjects = n(),
    Taller_than_sixft = sum(height > 190, na.rm=TRUE),
    Percentage_over6ft = Taller_than_sixft/Subjects*100
    )
`summarise()` has grouped output by 'gender'. You can override using the
`.groups` argument.
# A tibble: 12 × 5
# Groups:   gender [2]
   gender ethnicity      Subjects Taller_than_sixft Percentage_over6ft
   <chr>  <chr>             <int>             <int>              <dbl>
 1 female Mexican             690                 0              0    
 2 female NH Asian            568                 0              0    
 3 female NH Black           1030                 0              0    
 4 female NH White           1464                 0              0    
 5 female Other Hispanic      399                 0              0    
 6 female Other/Mixed         280                 0              0    
 7 male   Mexican             608                 1              0.164
 8 male   NH Asian            518                 0              0    
 9 male   NH Black            980                25              2.55 
10 male   NH White           1467                14              0.954
11 male   Other Hispanic      374                 0              0    
12 male   Other/Mixed         326                 5              1.53 

Aufgabe 2

In der Hausaufgabe der vorigen Woche haben wir in der NHANES-Tabelle die mittlere Körpergröße, aufgeschlüsselt nach Geschlecht und Ethnie, berechnet.

nhanes %>%
  group_by(gender, ethnicity) %>%
  summarise(Avg_Height = mean(height, na.rm=TRUE))
`summarise()` has grouped output by 'gender'. You can override using the
`.groups` argument.
# A tibble: 12 × 3
# Groups:   gender [2]
   gender ethnicity      Avg_Height
   <chr>  <chr>               <dbl>
 1 female Mexican              148.
 2 female NH Asian             150.
 3 female NH Black             155.
 4 female NH White             152.
 5 female Other Hispanic       151.
 6 female Other/Mixed          147.
 7 male   Mexican              160.
 8 male   NH Asian             162.
 9 male   NH Black             162.
10 male   NH White             164.
11 male   Other Hispanic       158.
12 male   Other/Mixed          160.

Schlüsseln Sie diesmal nach Geschlecht und Alter auf.

nhanes %>%
  group_by(gender, age) %>%
  summarise(Avg_Height = mean(height, na.rm=TRUE))
`summarise()` has grouped output by 'gender'. You can override using the
`.groups` argument.
# A tibble: 162 × 3
# Groups:   gender [2]
   gender   age Avg_Height
   <chr>  <dbl>      <dbl>
 1 female     0      NaN  
 2 female     1      NaN  
 3 female     2       89.5
 4 female     3       97.7
 5 female     4      106. 
 6 female     5      112. 
 7 female     6      119. 
 8 female     7      124. 
 9 female     8      132. 
10 female     9      137. 
# ℹ 152 more rows

Erzeugen Sie einen Plot, der die Durschnittsgröße von Frauen/Mädchen und von Männern/Jungen für jedes Lebensalter darstellt.

nhanes %>%
  group_by(gender, age) %>%
  summarise(Avg_Height = mean(height, na.rm=TRUE)) %>%
  ggplot +
  geom_point(aes(x = age , y=Avg_Height, col=gender)) +
  labs(x = "Age [years]", y = "Average Height [cm]")
`summarise()` has grouped output by 'gender'. You can override using the
`.groups` argument.
Warning: Removed 4 rows containing missing values or values outside the scale range
(`geom_point()`).

Vielleicht hilft es, in der x-Achse des Plots hineinzuzoomen, und die Achse nur von 0 bis 30 Jahre laufen zu lassen. Googlen Sie, wie man den auf der Achse dargestellten Wertebereich (“axis limits”) ändert, wenn man “ggplot” verwendet.

nhanes %>%
  group_by(gender, age) %>%
  summarise(Avg_Height = mean(height, na.rm=TRUE)) %>%
  ggplot + 
  geom_point(aes(x=age, y=Avg_Height, col=gender)) +
  scale_x_continuous(limits= c(0, 30)) + 
  labs(x = "Age [years]", y = "Average Height [cm]")
`summarise()` has grouped output by 'gender'. You can override using the
`.groups` argument.
Warning: Removed 104 rows containing missing values or values outside the scale range
(`geom_point()`).

Aufgabe 3

Bauen Sie Schritt für Schritt eine Tidyverse-Pipeline wie folgt auf:

  • Beginnen Sie mit der NHANES-Tabelle

  • Entfernen Sie Probanden, wo die Körpergröße oder das Gewicht fehlt, sowie Probanden mit Alter unter 18 Jahren.

  • Fügen Sie eine Spalte bmi hinzu, die den Body-Mass-Index berechnet.

nhanes %>%
  filter(!is.na(height), !is.na(weight), age >= 18) %>%
  mutate(BMI = weight/(height/100)^2)
# A tibble: 5,434 × 7
   subjectId gender   age height weight ethnicity     BMI
       <dbl> <chr>  <dbl>  <dbl>  <dbl> <chr>       <dbl>
 1     93705 female    66   158.   79.5 NH Black     31.7
 2     93706 male      18   176.   66.3 NH Asian     21.5
 3     93708 female    66   150.   53.5 NH Asian     23.7
 4     93709 female    75   151.   88.8 NH Black     38.9
 5     93711 male      56   171.   62.1 NH Asian     21.3
 6     93712 male      18   173.   58.9 Mexican      19.7
 7     93713 male      67   179.   74.9 NH White     23.5
 8     93714 female    54   148.   87.1 NH Black     39.9
 9     93715 male      71   171.   65.6 Other/Mixed  22.5
10     93716 male      61   159.   77.7 NH Asian     30.7
# ℹ 5,424 more rows
  • Erwachsene mit einem BMI über 25 gelten laut WHO-Leitlinien als übergewichtig. Bei einem BMI über 30 liegt krankhaftes Übergewicht (“Adipositas”) vor. Zählen Sie, wie viele Probanden übergewichtig sind und wie viele adipös.

    nhanes %>%
      filter(!is.na(height), !is.na(weight), age >= 18) %>%
      mutate(BMI = weight/(height/100)^2) %>%
      summarise(
        Overweight = sum(BMI > 25),
        Obese = sum(BMI > 30)
         )
    # A tibble: 1 × 2
      Overweight Obese
           <int> <int>
    1       3952  2227
  • Ermitteln Sie diese Zahlen aufgeschlüsselt nach Geschlecht und Ethnie, und rechnen Sie sie in Prozent um.

    nhanes %>%
      filter(!is.na(height), !is.na(weight), age>=18) %>%
      mutate(BMI = weight/(height/100)^2) %>%
      group_by(gender, ethnicity) %>%
      summarise(
        Subjects = n(),
        Overweight = sum(BMI > 25),
        Overweight_Percentage = Overweight/Subjects*100,
        Obese = sum(BMI > 30),
        Obese_Percentage = Obese/Subjects*100
      ) -> nhanes_BMI_overweight
    `summarise()` has grouped output by 'gender'. You can override using the
    `.groups` argument.
    nhanes_BMI_overweight
    # A tibble: 12 × 7
    # Groups:   gender [2]
       gender ethnicity      Subjects Overweight Overweight_Percentage Obese
       <chr>  <chr>             <int>      <int>                 <dbl> <int>
     1 female Mexican             376        312                  83.0   187
     2 female NH Asian            418        195                  46.7    67
     3 female NH Black            667        540                  81.0   385
     4 female NH White            945        663                  70.2   402
     5 female Other Hispanic      277        211                  76.2   111
     6 female Other/Mixed         128         90                  70.3    64
     7 male   Mexican             362        307                  84.8   167
     8 male   NH Asian            366        225                  61.5    57
     9 male   NH Black            593        412                  69.5   234
    10 male   NH White            920        690                  75     399
    11 male   Other Hispanic      228        193                  84.6    86
    12 male   Other/Mixed         154        114                  74.0    68
    # ℹ 1 more variable: Obese_Percentage <dbl>

Ersatzergebnis: Das korrekte Ergebnis, zum Vergleichen:

read_csv("data_on_git/nhanes_bmi_smr.csv")
Rows: 12 Columns: 7
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (2): gender, ethnicity
dbl (5): n, n_overweight, n_obese, percent_overweight, percent_obese

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# A tibble: 12 × 7
   gender ethnicity      n n_overweight n_obese percent_overweight percent_obese
   <chr>  <chr>      <dbl>        <dbl>   <dbl>              <dbl>         <dbl>
 1 female Mexican      376          312     187              0.830         0.497
 2 female NH Asian     418          195      67              0.467         0.160
 3 female NH Black     667          540     385              0.810         0.577
 4 female NH White     945          663     402              0.702         0.425
 5 female Other His…   277          211     111              0.762         0.401
 6 female Other/Mix…   128           90      64              0.703         0.5  
 7 male   Mexican      362          307     167              0.848         0.461
 8 male   NH Asian     366          225      57              0.615         0.156
 9 male   NH Black     593          412     234              0.695         0.395
10 male   NH White     920          690     399              0.75          0.434
11 male   Other His…   228          193      86              0.846         0.377
12 male   Other/Mix…   154          114      68              0.740         0.442

Erstellen Sie nun ein Diagramm der Übergewichts-Anteile. Verwenden Sie Ethnie als x-Achse, Prozent übergewichtig als y-Achse, und stellen Sie das Geschlecht durch die Farbe dar. Ersetzen Sie dann geom_point( aes(...) ) durch geom_col( aes(...), position="dodge") und dann noch col durch fill. Sie sollten ein Säulendiagramm (auch Balkendiagramm genannt, engl. bar chart)

nhanes_BMI_overweight %>%
  ggplot +
  geom_col(aes(x = ethnicity, y = Overweight_Percentage, fill= gender), position=position_dodge(1)) +
  labs(y = "Percentage of Overweight Subjects")