From 333d2bc151237115c11696680e8ac0bb19ceb61a Mon Sep 17 00:00:00 2001 From: jgilis Date: Mon, 10 Feb 2020 15:50:52 +0100 Subject: [PATCH] add partial solutions --- pages/.DS_Store | Bin 14340 -> 14340 bytes .../08-MultipleRegression-FEV-partial.html | 558 ++++++++++++++++++ ...> 08-MultipleRegression_fish_partial.html} | 0 .../08_multipleRegression.md | 2 +- ....html => 10-categorical-salk-partial.html} | 0 .../10-categoricalAnalysis.md | 2 +- 6 files changed, 560 insertions(+), 2 deletions(-) create mode 100644 pages/08-multipleRegression/08-MultipleRegression-FEV-partial.html rename pages/08-multipleRegression/{08-MultipleRegression_fish.html => 08-MultipleRegression_fish_partial.html} (100%) rename pages/10-categoricalAnalysis/{10-categorical-salk.html => 10-categorical-salk-partial.html} (100%) diff --git a/pages/.DS_Store b/pages/.DS_Store index 5b2594d47fe6e084ce81ea4c8d23e932cb88946c..549e135c4914c05ade8e6b57ef9742ed292162fb 100644 GIT binary patch delta 16 XcmZoEXeromN__HMb + + + + + + + + + + + + +Tutorial 8.2: Multiple regression on the FEV dataset + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+
+
+ +
+ + + + + + + +

As an exercise on multiple regression, we will analyse the FEV dataset.

+
+

1 The FEV dataset

+

The FEV, which is an acronym for forced expiratory volume, is a measure of how much air a person can exhale (in liters) during a forced breath. In this dataset, the FEV of 606 children, between the ages of 6 and 17, were measured. The dataset also provides additional information on these children: their age, their height, their gender and, most importantly, whether the child is a smoker or a non-smoker.

+

The goal of this experiment was to find out whether or not smoking has an effect on the FEV of children.

+
+
+

2 Load the required libraries

+
library(tidyverse)
+library(GGally)
+
+
+

3 Import the data

+
fev <- read_tsv("https://raw.githubusercontent.com/GTPB/PSLS20/master/data/fev.txt")
+
## Parsed with column specification:
+## cols(
+##   age = col_double(),
+##   fev = col_double(),
+##   height = col_double(),
+##   gender = col_character(),
+##   smoking = col_double()
+## )
+
head(fev)
+
## # A tibble: 6 x 5
+##     age   fev height gender smoking
+##   <dbl> <dbl>  <dbl> <chr>    <dbl>
+## 1     9  1.71   57   f            0
+## 2     8  1.72   67.5 f            0
+## 3     7  1.72   54.5 f            0
+## 4     9  1.56   53   m            0
+## 5     9  1.90   57   m            0
+## 6     8  2.34   61   f            0
+
+
+

4 Data tidying

+

There are a few things in the formatting of the data that can be improved upon:

+
    +
  1. Both the gender and smoking should be transformed to factors.
  2. +
  3. The height variable is written in inches. Let’s add a new column, height_cm, with the values converted to centimeters.
  4. +
+
fev <- fev %>%
+  mutate(gender = as.factor(gender)) %>%
+  mutate(smoking = as.factor(smoking)) %>%
+  mutate(height_cm = height*2.54)
+
+head(fev)
+
## # A tibble: 6 x 6
+##     age   fev height gender smoking height_cm
+##   <dbl> <dbl>  <dbl> <fct>  <fct>       <dbl>
+## 1     9  1.71   57   f      0            145.
+## 2     8  1.72   67.5 f      0            171.
+## 3     7  1.72   54.5 f      0            138.
+## 4     9  1.56   53   m      0            135.
+## 5     9  1.90   57   m      0            145.
+## 6     8  2.34   61   f      0            155.
+

That’s better!

+
+
+

5 Data exploration

+

Remember the “Data_exploration_FEV.Rmd” exercise? There, we saw that plotting the FEV in function of smoking status only, it appeared that the FEV was higher for smokers. However, if we “corrected” the visualization for a child’s age and/or heigth and/or gender, this completely changed the picture. As such, it is clear that, in order to study the effect of smoking on the FEV, we should account for these other variables in the dataset (commonly referred to as confounders).

+

First, we can take a lookt at the associations and correlations between the different variables.

+
fev %>% 
+  mutate(lfev=log(fev)) %>% 
+  dplyr::select(smoking,gender,age,height_cm,lfev) %>% 
+  ggpairs()
+

+

We absorve some very clear associations between - age and height - age and lFEV - heigth and lFEV,

+

as well as some less pronounced associations between - gender and height - gender and FEV.

+

The relationship between height (in centimeters) and the logarithm of the FEV is linear:

+
fev %>%
+  ggplot(aes(x=height_cm,y=log(fev), col=smoking)) +
+  geom_point() +
+  scale_color_manual(values=c("dimgrey","red")) +
+  theme_bw() +
+  ggtitle("height versus log(FEV)") +
+  xlab("height (cm)") 
+

+

On the other hand, the relationship between age and the logarithm of the FEV is more quadratic:

+
fev %>%
+  ggplot(aes(x=age,y=log(fev), col=smoking)) +
+  geom_point() +
+  scale_color_manual(values=c("dimgrey","red")) +
+  theme_bw() +
+  ggtitle("height versus log(FEV)") +
+  xlab("height (cm)") 
+

+

Remember the “Data_exploration_FEV.Rmd” file? There, we saw that plotting the FEV in function of smoking status only, it appeared that the FEV was higher for smokers. We showed this as follows:

+
fev %>%
+  ggplot(aes(x=smoking,y=fev,fill=smoking)) +
+  geom_boxplot(outlier.shape=NA) +
+  geom_point(size = 0.1, position = position_jitterdodge()) +
+  theme_bw() +
+  scale_fill_manual(values=c("dimgrey","firebrick")) +
+  ggtitle("Boxplot of FEV versus smoking") +
+  ylab("fev (l)") +
+  xlab("smoking status")
+

+

However, if we accounted for a child’s age and/or heigth and/or gender in the visualization, this completely changed the picture.

+

Let’s again make a nice plot where we make a boxplot of the FEV in function of age (as factor), stratified on gender (facet) and colored based on the smoking status.

+
fev %>%
+  ggplot(aes(x=as.factor(age),y=fev,fill=smoking)) +
+  geom_boxplot(outlier.shape=NA) +
+  geom_point(size = 0.1, position = position_jitterdodge()) +
+  theme_bw() +
+  scale_fill_manual(values=c("dimgrey","firebrick")) +
+  ggtitle("Boxplot of FEV versus smoking, stratified on age and gender") +
+  ylab("fev (l)") +
+  xlab("age (years)") + 
+  facet_grid(rows = vars(gender))
+

+
+
+

6 Analysis

+
+

6.1 Full model

+
full_formula <- log(fev)~ age + height_cm + smoking + gender + smoking:age + smoking:height_cm + smoking:gender + age:height_cm + age:gender + height_cm:gender
+
+lm_full <- lm(full_formula, data=fev)
+
+summary(lm_full)
+
## 
+## Call:
+## lm(formula = full_formula, data = fev)
+## 
+## Residuals:
+##      Min       1Q   Median       3Q      Max 
+## -0.54574 -0.08702  0.01396  0.09634  0.35404 
+## 
+## Coefficients:
+##                      Estimate Std. Error t value Pr(>|t|)    
+## (Intercept)        -1.782e+00  3.055e-01  -5.835 8.84e-09 ***
+## age                 3.953e-02  3.179e-02   1.243    0.214    
+## height_cm           1.538e-02  2.076e-03   7.407 4.44e-13 ***
+## smoking1           -1.137e-01  4.670e-01  -0.243    0.808    
+## genderm            -2.342e-01  1.864e-01  -1.256    0.209    
+## age:smoking1       -2.158e-02  1.021e-02  -2.113    0.035 *  
+## height_cm:smoking1  2.056e-03  2.863e-03   0.718    0.473    
+## smoking1:genderm    2.651e-03  4.939e-02   0.054    0.957    
+## age:height_cm      -5.835e-05  1.986e-04  -0.294    0.769    
+## age:genderm        -1.823e-03  7.672e-03  -0.238    0.812    
+## height_cm:genderm   1.779e-03  1.486e-03   1.197    0.232    
+## ---
+## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
+## 
+## Residual standard error: 0.1423 on 595 degrees of freedom
+## Multiple R-squared:  0.7846, Adjusted R-squared:  0.781 
+## F-statistic: 216.7 on 10 and 595 DF,  p-value: < 2.2e-16
+

Decide on how to communicate the results!

+
+
+
+
+

Home

+
+ +
LS0tCnRpdGxlOiAiVHV0b3JpYWwgOC4yOiBNdWx0aXBsZSByZWdyZXNzaW9uIG9uIHRoZSBGRVYgZGF0YXNldCIgICAKb3V0cHV0OgogICAgaHRtbF9kb2N1bWVudDoKICAgICAgY29kZV9kb3dubG9hZDogdHJ1ZSAgICAKICAgICAgdGhlbWU6IGNvc21vCiAgICAgIHRvYzogdHJ1ZQogICAgICB0b2NfZmxvYXQ6IHRydWUKICAgICAgaGlnaGxpZ2h0OiB0YW5nbwogICAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKLS0tCgpBcyBhbiBleGVyY2lzZSBvbiBtdWx0aXBsZSByZWdyZXNzaW9uLCB3ZSB3aWxsIGFuYWx5c2UKdGhlIEZFViBkYXRhc2V0LgoKIyBUaGUgRkVWIGRhdGFzZXQKClRoZSBGRVYsIHdoaWNoIGlzIGFuIGFjcm9ueW0gZm9yIGZvcmNlZCBleHBpcmF0b3J5IHZvbHVtZSwKaXMgYSBtZWFzdXJlIG9mIGhvdyBtdWNoIGFpciBhIHBlcnNvbiBjYW4gZXhoYWxlIChpbiBsaXRlcnMpIApkdXJpbmcgIGEgZm9yY2VkIGJyZWF0aC4gSW4gdGhpcyBkYXRhc2V0LCB0aGUgRkVWIG9mIDYwNiBjaGlsZHJlbiwKYmV0d2VlbiB0aGUgYWdlcyBvZiA2IGFuZCAxNywgd2VyZSBtZWFzdXJlZC4gVGhlIGRhdGFzZXQKYWxzbyBwcm92aWRlcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIHRoZXNlIGNoaWxkcmVuOgp0aGVpciBgYWdlYCwgdGhlaXIgYGhlaWdodGAsIHRoZWlyIGBnZW5kZXJgIGFuZCwgbW9zdAppbXBvcnRhbnRseSwgd2hldGhlciB0aGUgY2hpbGQgaXMgYSBzbW9rZXIgb3IgYSBub24tc21va2VyLgoKVGhlIGdvYWwgb2YgdGhpcyBleHBlcmltZW50IHdhcyB0byBmaW5kIG91dCB3aGV0aGVyIG9yIG5vdApzbW9raW5nIGhhcyBhbiBlZmZlY3Qgb24gdGhlIEZFViBvZiBjaGlsZHJlbi4KCiMgTG9hZCB0aGUgcmVxdWlyZWQgbGlicmFyaWVzCgpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShHR2FsbHkpCmBgYAoKIyBJbXBvcnQgdGhlIGRhdGEKCmBgYHtyfQpmZXYgPC0gcmVhZF90c3YoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9HVFBCL1BTTFMyMC9tYXN0ZXIvZGF0YS9mZXYudHh0IikKaGVhZChmZXYpCmBgYAoKIyBEYXRhIHRpZHlpbmcKClRoZXJlIGFyZSBhIGZldyB0aGluZ3MgaW4gdGhlIGZvcm1hdHRpbmcgb2YgdGhlCmRhdGEgdGhhdCBjYW4gYmUgaW1wcm92ZWQgdXBvbjoKCjEuIEJvdGggdGhlIGBnZW5kZXJgIGFuZCBgc21va2luZ2Agc2hvdWxkIGJlIHRyYW5zZm9ybWVkIHRvCmZhY3RvcnMuCjIuIFRoZSBgaGVpZ2h0YCB2YXJpYWJsZSBpcyB3cml0dGVuIGluIGluY2hlcy4KTGV0J3MgYWRkIGEgbmV3IGNvbHVtbiwgYGhlaWdodF9jbWAsIHdpdGggdGhlIHZhbHVlcwpjb252ZXJ0ZWQgdG8gY2VudGltZXRlcnMuCgpgYGB7cn0KZmV2IDwtIGZldiAlPiUKICBtdXRhdGUoZ2VuZGVyID0gYXMuZmFjdG9yKGdlbmRlcikpICU+JQogIG11dGF0ZShzbW9raW5nID0gYXMuZmFjdG9yKHNtb2tpbmcpKSAlPiUKICBtdXRhdGUoaGVpZ2h0X2NtID0gaGVpZ2h0KjIuNTQpCgpoZWFkKGZldikKYGBgCgpUaGF0J3MgYmV0dGVyIQoKIyBEYXRhIGV4cGxvcmF0aW9uCgpSZW1lbWJlciB0aGUgIkRhdGFfZXhwbG9yYXRpb25fRkVWLlJtZCIgZXhlcmNpc2U/IFRoZXJlLCB3ZQpzYXcgdGhhdCBwbG90dGluZyB0aGUgRkVWIGluIGZ1bmN0aW9uIG9mIHNtb2tpbmcgc3RhdHVzCm9ubHksIGl0IGFwcGVhcmVkIHRoYXQgdGhlIEZFViB3YXMgaGlnaGVyIGZvciBzbW9rZXJzLgpIb3dldmVyLCBpZiB3ZSAiY29ycmVjdGVkIiB0aGUgdmlzdWFsaXphdGlvbiBmb3IgYSBjaGlsZCdzCmFnZSBhbmQvb3IgaGVpZ3RoIGFuZC9vciBnZW5kZXIsIHRoaXMgY29tcGxldGVseSBjaGFuZ2VkIHRoZSBwaWN0dXJlLgpBcyBzdWNoLCBpdCBpcyBjbGVhciB0aGF0LCBpbiBvcmRlciB0byBzdHVkeSB0aGUgZWZmZWN0IG9mIHNtb2tpbmcKb24gdGhlIEZFViwgd2Ugc2hvdWxkIGFjY291bnQgZm9yIHRoZXNlIG90aGVyIHZhcmlhYmxlcyBpbiB0aGUgZGF0YXNldAooY29tbW9ubHkgcmVmZXJyZWQgdG8gYXMgY29uZm91bmRlcnMpLgoKRmlyc3QsIHdlIGNhbiB0YWtlIGEgbG9va3QgYXQgdGhlIGFzc29jaWF0aW9ucyBhbmQgY29ycmVsYXRpb25zIGJldHdlZW4KdGhlIGRpZmZlcmVudCB2YXJpYWJsZXMuCgpgYGB7ciwgbWVzc2FnZT1GQUxTRX0KZmV2ICU+JSAKICBtdXRhdGUobGZldj1sb2coZmV2KSkgJT4lIAogIGRwbHlyOjpzZWxlY3Qoc21va2luZyxnZW5kZXIsYWdlLGhlaWdodF9jbSxsZmV2KSAlPiUgCiAgZ2dwYWlycygpCmBgYAoKV2UgYWJzb3J2ZSBzb21lIHZlcnkgY2xlYXIgYXNzb2NpYXRpb25zIGJldHdlZW4KLSBhZ2UgYW5kIGhlaWdodAotIGFnZSBhbmQgbEZFVgotIGhlaWd0aCBhbmQgbEZFViwKCmFzIHdlbGwgYXMgc29tZSBsZXNzIHByb25vdW5jZWQgYXNzb2NpYXRpb25zIGJldHdlZW4KLSBnZW5kZXIgYW5kIGhlaWdodAotIGdlbmRlciBhbmQgRkVWLgoKVGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGhlaWdodCAoaW4gY2VudGltZXRlcnMpIGFuZCB0aGUKbG9nYXJpdGhtIG9mIHRoZSBGRVYgaXMgbGluZWFyOgoKYGBge3J9CmZldiAlPiUKICBnZ3Bsb3QoYWVzKHg9aGVpZ2h0X2NtLHk9bG9nKGZldiksIGNvbD1zbW9raW5nKSkgKwogIGdlb21fcG9pbnQoKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCJkaW1ncmV5IiwicmVkIikpICsKICB0aGVtZV9idygpICsKICBnZ3RpdGxlKCJoZWlnaHQgdmVyc3VzIGxvZyhGRVYpIikgKwogIHhsYWIoImhlaWdodCAoY20pIikgCmBgYAoKT24gdGhlIG90aGVyIGhhbmQsIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBhZ2UgYW5kIHRoZQpsb2dhcml0aG0gb2YgdGhlIEZFViBpcyBtb3JlIHF1YWRyYXRpYzoKCmBgYHtyfQpmZXYgJT4lCiAgZ2dwbG90KGFlcyh4PWFnZSx5PWxvZyhmZXYpLCBjb2w9c21va2luZykpICsKICBnZW9tX3BvaW50KCkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiZGltZ3JleSIsInJlZCIpKSArCiAgdGhlbWVfYncoKSArCiAgZ2d0aXRsZSgiaGVpZ2h0IHZlcnN1cyBsb2coRkVWKSIpICsKICB4bGFiKCJoZWlnaHQgKGNtKSIpIApgYGAKClJlbWVtYmVyIHRoZSAiRGF0YV9leHBsb3JhdGlvbl9GRVYuUm1kIiBmaWxlPyBUaGVyZSwgd2UKc2F3IHRoYXQgcGxvdHRpbmcgdGhlIEZFViBpbiBmdW5jdGlvbiBvZiBzbW9raW5nIHN0YXR1cwpvbmx5LCBpdCBhcHBlYXJlZCB0aGF0IHRoZSBGRVYgd2FzIGhpZ2hlciBmb3Igc21va2Vycy4KV2Ugc2hvd2VkIHRoaXMgYXMgZm9sbG93czoKCmBgYHtyfQpmZXYgJT4lCiAgZ2dwbG90KGFlcyh4PXNtb2tpbmcseT1mZXYsZmlsbD1zbW9raW5nKSkgKwogIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlPU5BKSArCiAgZ2VvbV9wb2ludChzaXplID0gMC4xLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcmRvZGdlKCkpICsKICB0aGVtZV9idygpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiZGltZ3JleSIsImZpcmVicmljayIpKSArCiAgZ2d0aXRsZSgiQm94cGxvdCBvZiBGRVYgdmVyc3VzIHNtb2tpbmciKSArCiAgeWxhYigiZmV2IChsKSIpICsKICB4bGFiKCJzbW9raW5nIHN0YXR1cyIpCmBgYAoKSG93ZXZlciwgaWYgd2UgYWNjb3VudGVkIGZvciBhIGNoaWxkJ3MgYWdlIGFuZC9vciBoZWlndGggCmFuZC9vciBnZW5kZXIgaW4gdGhlIHZpc3VhbGl6YXRpb24sIHRoaXMgY29tcGxldGVseSBjaGFuZ2VkIHRoZSBwaWN0dXJlLgoKTGV0J3MgYWdhaW4gbWFrZSBhIG5pY2UgcGxvdCB3aGVyZSB3ZSBtYWtlIGEgYm94cGxvdCBvZiB0aGUgRkVWIAppbiBmdW5jdGlvbiBvZiBhZ2UgKGFzIGZhY3RvciksIHN0cmF0aWZpZWQgb24gZ2VuZGVyIChmYWNldCkgCmFuZCBjb2xvcmVkIGJhc2VkIG9uIHRoZSBzbW9raW5nIHN0YXR1cy4KCmBgYHtyfQpmZXYgJT4lCiAgZ2dwbG90KGFlcyh4PWFzLmZhY3RvcihhZ2UpLHk9ZmV2LGZpbGw9c21va2luZykpICsKICBnZW9tX2JveHBsb3Qob3V0bGllci5zaGFwZT1OQSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDAuMSwgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXJkb2RnZSgpKSArCiAgdGhlbWVfYncoKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoImRpbWdyZXkiLCJmaXJlYnJpY2siKSkgKwogIGdndGl0bGUoIkJveHBsb3Qgb2YgRkVWIHZlcnN1cyBzbW9raW5nLCBzdHJhdGlmaWVkIG9uIGFnZSBhbmQgZ2VuZGVyIikgKwogIHlsYWIoImZldiAobCkiKSArCiAgeGxhYigiYWdlICh5ZWFycykiKSArIAogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZ2VuZGVyKSkKYGBgCgojIEFuYWx5c2lzCgojIyBGdWxsIG1vZGVsCgpgYGB7cn0KZnVsbF9mb3JtdWxhIDwtIGxvZyhmZXYpfiBhZ2UgKyBoZWlnaHRfY20gKyBzbW9raW5nICsgZ2VuZGVyICsgc21va2luZzphZ2UgKyBzbW9raW5nOmhlaWdodF9jbSArIHNtb2tpbmc6Z2VuZGVyICsgYWdlOmhlaWdodF9jbSArIGFnZTpnZW5kZXIgKyBoZWlnaHRfY206Z2VuZGVyCgpsbV9mdWxsIDwtIGxtKGZ1bGxfZm9ybXVsYSwgZGF0YT1mZXYpCgpzdW1tYXJ5KGxtX2Z1bGwpCmBgYAoKKipEZWNpZGUgb24gaG93IHRvIGNvbW11bmljYXRlIHRoZSByZXN1bHRzISoqCgoKLS0tCgojIFtIb21lXShodHRwczovL2d0cGIuZ2l0aHViLmlvL1BTTFMyMC8pIHstfQo=
+ + +
+
+ +
+ + + + + + + + + + + + + + + + + diff --git a/pages/08-multipleRegression/08-MultipleRegression_fish.html b/pages/08-multipleRegression/08-MultipleRegression_fish_partial.html similarity index 100% rename from pages/08-multipleRegression/08-MultipleRegression_fish.html rename to pages/08-multipleRegression/08-MultipleRegression_fish_partial.html diff --git a/pages/08-multipleRegression/08_multipleRegression.md b/pages/08-multipleRegression/08_multipleRegression.md index a84051d..6adc76a 100644 --- a/pages/08-multipleRegression/08_multipleRegression.md +++ b/pages/08-multipleRegression/08_multipleRegression.md @@ -32,7 +32,7 @@ how to account for this. - Exercise: [Exercise_2](./08-MultipleRegression_FEV_half.html) - Data: "https://raw.githubusercontent.com/GTPB/PSLS20/master/data/fev.txt" -- Solution +- Solution: #### 3) The KPNA2 dataset diff --git a/pages/10-categoricalAnalysis/10-categorical-salk.html b/pages/10-categoricalAnalysis/10-categorical-salk-partial.html similarity index 100% rename from pages/10-categoricalAnalysis/10-categorical-salk.html rename to pages/10-categoricalAnalysis/10-categorical-salk-partial.html diff --git a/pages/10-categoricalAnalysis/10-categoricalAnalysis.md b/pages/10-categoricalAnalysis/10-categoricalAnalysis.md index 297347b..7a55a87 100644 --- a/pages/10-categoricalAnalysis/10-categoricalAnalysis.md +++ b/pages/10-categoricalAnalysis/10-categoricalAnalysis.md @@ -33,7 +33,7 @@ incidence of getting the polio disease. - Exercise: [Exercise_2](./10-categorical-salk-half.html) - Data: The data is generated in the script itself -- Solution: [Solution_2](./10-categorical-salk.html) +- Solution: