# Data from telephone interviewsdf.tel.raw <-read.delim("../data/tel22_CH.txt", header=TRUE)# Data from written surveysdf.sfb.raw <-read.delim("../data/sfb22_CH.txt", header=TRUE)# Calculated indicesdf.ind.raw <-read.delim("../data/indic22_CH.txt", header=TRUE)
3 Research questions
What is the association between leisure-time PA and LBP in adults living in Switzerland in 2022?
What other risk factors (e.g. BMI, age, occupational factors, psychosocial factors, and medical history) are associated with LBP in adults living in Switzerland in 2022?
4 Data preparation per survey type
4.1 Data of the telephone-based survey (df.tel.raw)
Code
# data preparation df.tel.addf.tel.ad <- df.tel.raw %>%mutate(# IDid = IDNO,# Sociodemographic: ALTER (int), SEX (int),# Kanton (int), TGEZU01 (num, height), TGEZU02 (num, weight), TSOUN24 (int, subj QoL)age =as.numeric(ALTER),sex =factor(SEX, levels =c(1,2), labels =c("Male", "Female")),strata =factor(KANTON, levels =c(1:26), labels =c("Zurich", "Bern", "Lucerne", "Uri","Schwyz", "Obwalden", "Nidwalden", "Glarus","Zug", "Fribourg", "Solothurn", "Basel-City","Basel-Country", "Schaffhausen", "Appenzell Ausserrhoden","Appenzell Innerrhoden", "St. Gallen", "Graubünden","Aargau", "Thurgau", "Tessin", "Vaud","Wallis", "Neuchâtel", "Geneva", "Jura")),height =as.numeric(TGEZU01),weight =as.numeric(TGEZU02),qol =factor(TSOUN24, levels =c(1:5), labels =c("Very good", "Good", "Neither good nor bad", "Bad", "Very bad")),# Age categories (ALTER7)age_cat =factor(ALTER7, levels =c(1:7), labels =c("18-24 years", "25-34 years", "35-44 years", "45-54 years", "55-64 years", "65-74 years", "75+ years")),# Dependent variable: TKRSY01 (int, back pain/low back pain, values 1 to 3, not -2)lbp =factor(TKRSY01, levels =c(1:3), labels =c("No", "A little", "Strong")),# Sedentary behaviour:sed_beh =as.numeric(TKOBW17), # Sitting: hours/day # Weight of telephone survey: WGHT (int)weighting.tel =as.numeric(WGHT),# Potential confounder# preg: TSCHW01 (int, preg at the moment)preg =factor(TSCHW01, levels =c(1,2), labels =c("Yes", "No")),# Connection between back pain and work: TKRSY35 (int, back/low back)lbp_w =factor(TKRSY35, levels =c(1:5), labels =c("Yes, certainly", "Yes, rather", "Partly", "No, rather not", "No, definitely not")),# Fever last 4 weeksfever =factor(TKRSY09, levels =c(1:3), labels =c("No", "A little", "Strong")),# Shoulder, Neck, Arm pain last 4 weeksshoul_neck_pain =factor(TKRSY09, levels =c(1:3), labels =c("No", "A little", "Strong")),# Medical diagnoses e.g. arthroses, asthma, incontinencediag_n =rowSums(across(c( TKRAN10l, TKRAN10m, TKRAN10d, TKRAN10a, TKRAN10e, TKRAN10b, TKRAN10i, TKRAN10o, TKRAN10j, TKRAN11l, TKRAN11m, TKRAN11d, TKRAN11a, TKRAN11e, TKRAN11b, TKRAN11i, TKRAN11o, TKRAN12a, TKRAN12b, TKRAN12c), ~ . =="1"), na.rm =TRUE),# Received care via SPITEX within the last 12 monthsspitex =factor(TINAN24, levels =c(1:2), labels =c("Yes", "No")),# Hospital stays in last 12 months in dayshospital =as.numeric(TINAN68))
# Sociodemographic variablesvar.socdem <-c("id", "age_cat", "bmi_cat", "civil_status", "lang_r", "nat", "sex")# Socioeconomic variablesvar.soceco <-c("education")# Income was not included as it had >15k missing values.# Stratae variable for cantonsvar.strata <-c("strata")## Weight variable for written survey to be used as income was also considered from written surveyvar.weight <-c("weighting.tel")
5.2 Dependent (LBP) & independent variable (PA)
Code
var.out <-c("lbp", "pa_cat")
5.3 Lifestyle factors and factors by Hartvigsen et al. 2018
Code
# Lifestyle factorsvar.life <-c("diet", "sleep", "sed_beh", "soc","tobacco", "alcohol", "drugs")# Model by Hartvigsen et al. 2018var.model <-c(# sex + BMI + education already included as confounder# Depressive symptoms DEPPHQ5"dep",# Anxiety ANXGAD4"anxiety",# Arterial Hypertension, HYPERTENS"aht",# Hypercholesterolaemia, HYPERCHOL"hyperchol",# Diabetes, DIABETE"diabetes")
Code
# without confoundervar.all <-c(var.socdem, var.soceco, var.strata, var.out, var.life, var.model, var.weight)
# adjusted modelm1.q1.adj.adapted <-adapt.models(m1.q1.adj, variables.q1)m1.q1.adj.adapted <- m1.q1.adj.adapted %>%mutate(`adjusted OR`=`Odds Ratio`,`adjusted 95% CI`=`95% CI`,`adjusted p value`= p) %>%select(LBP, Variable, Parameter, `adjusted OR`, `adjusted 95% CI`, `adjusted p value`) %>%mutate(Variable = dplyr::recode(Variable,pa_cat ="Physical activity level",sex ="Sex",age_cat ="Age category",bmi_cat ="BMI category",civil_status ="Civil status",nat ="Nationality",lang_r ="Language region",education ="Education",income ="Monthly household income"))ft.m1.q1.adj.adapted <-flextable(m1.q1.adj.adapted)ft.m1.q1.adj.adapted <- ft.m1.q1.adj.adapted %>%set_caption("Table. Model 1 on association of other factors with LBP - adjusted") %>%autofit() %>%bold(part ="header") %>%align(align ="center", part ="all")ft.m1.q1.adj.adapted
LBP
Variable
Parameter
adjusted OR
adjusted 95% CI
adjusted p value
A little LBP
Physical activity level
Partially active
1.05
[0.84; 1.33]
0.658
Physical activity level
Irregularly active
1.07
[0.86; 1.33]
0.552
Physical activity level
Regularly active
0.98
[0.78; 1.24]
0.873
Physical activity level
Trained
0.80
[0.64; 1]
0.051
Sex
Female
1.40
[1.27; 1.54]
0.000
Age category
18-24 years
0.89
[0.71; 1.11]
0.291
Age category
25-34 years
1.13
[0.95; 1.35]
0.177
Age category
35-44 years
0.92
[0.79; 1.07]
0.269
Age category
55-64 years
0.92
[0.8; 1.06]
0.232
Age category
65-74 years
0.91
[0.79; 1.06]
0.233
Age category
75+ years
0.94
[0.77; 1.14]
0.531
BMI category
Underweight
0.97
[0.75; 1.24]
0.783
BMI category
Overweight
1.01
[0.91; 1.13]
0.803
BMI category
Obesity
1.25
[1.08; 1.45]
0.004
Civil status
Married
0.98
[0.86; 1.12]
0.781
Civil status
Divorced
1.10
[0.92; 1.33]
0.292
Civil status
Widowed
1.07
[0.8; 1.42]
0.652
Nationality
Foreigner
1.00
[0.89; 1.12]
0.976
Language region
French-speaking Switzerland
1.14
[1.03; 1.26]
0.012
Language region
Italian-speaking Switzerland
0.93
[0.8; 1.09]
0.366
Education
Upper secondary education
0.97
[0.82; 1.15]
0.732
Education
Tertiary level
0.83
[0.69; 0.98]
0.033
Strong LBP
Physical activity level
Partially active
0.61
[0.44; 0.83]
0.002
Physical activity level
Irregularly active
0.48
[0.36; 0.65]
0.000
Physical activity level
Regularly active
0.52
[0.38; 0.71]
0.000
Physical activity level
Trained
0.35
[0.26; 0.49]
0.000
Sex
Female
1.81
[1.51; 2.16]
0.000
Age category
18-24 years
0.64
[0.41; 1.01]
0.053
Age category
25-34 years
1.10
[0.77; 1.55]
0.604
Age category
35-44 years
1.01
[0.76; 1.35]
0.921
Age category
55-64 years
1.12
[0.86; 1.46]
0.392
Age category
65-74 years
0.90
[0.68; 1.2]
0.472
Age category
75+ years
0.98
[0.68; 1.42]
0.928
BMI category
Underweight
1.18
[0.74; 1.87]
0.493
BMI category
Overweight
1.03
[0.85; 1.26]
0.744
BMI category
Obesity
1.80
[1.41; 2.29]
0.000
Civil status
Married
1.26
[0.99; 1.62]
0.064
Civil status
Divorced
1.70
[1.19; 2.41]
0.003
Civil status
Widowed
1.43
[0.89; 2.28]
0.135
Nationality
Foreigner
1.24
[0.99; 1.54]
0.056
Language region
French-speaking Switzerland
1.16
[0.96; 1.4]
0.115
Language region
Italian-speaking Switzerland
0.77
[0.57; 1.04]
0.084
Education
Upper secondary education
1.06
[0.8; 1.4]
0.687
Education
Tertiary level
0.61
[0.45; 0.82]
0.001
Code
save(m1.q1.adj.adapted, file ="../tables/models/m1.q1.adjusted.rda")ft.m1.q1.adj.adapted %>%set_caption("Model 1 on association of other factors with LBP - adjusted") %>%autofit() %>%bold(part ="header") %>%align(align ="center", part ="all") %>% flextable::line_spacing(space =1.0) %>% flextable::fontsize(size =8, part ="all") %>% flextable::font(fontname ="Times New Roman", part ="all") %>% flextable::save_as_docx(path ="../tables/models/model1.q1.adjusted.docx")
m2.q1.male.adapted <-adapt.models(m2.q1.male.raw, variables.q1)m2.q1.female.adapted <-adapt.models(m2.q1.female.raw, variables.q1)m2.q1.male.adapted <- m2.q1.male.adapted %>%mutate(`adjusted OR (male)`=`Odds Ratio`,`95% CI (male)`=`95% CI`,`p value (male)`= p) %>%select(LBP, Variable, Parameter, `adjusted OR (male)`, `95% CI (male)`, `p value (male)`)m2.q1.female.adapted <- m2.q1.female.adapted %>%mutate(`adjusted OR (female)`=`Odds Ratio`,`95% CI (female)`=`95% CI`,`p value (female)`= p) %>%select(LBP, Variable, Parameter, `adjusted OR (female)`, `95% CI (female)`, `p value (female)`)m2.q1.combined <- dplyr::bind_cols( m2.q1.male.adapted, m2.q1.female.adapted %>%select(`adjusted OR (female)`, `95% CI (female)`, `p value (female)`)) %>%mutate(Variable = dplyr::recode(Variable,pa_cat ="Physical activity level",sex ="Sex",age_cat ="Age category",bmi_cat ="BMI category",civil_status ="Civil status",nat ="Nationality",lang_r ="Language region",education ="Education",income ="Monthly household income"))ft.m2.q1.combined <-flextable(m2.q1.combined)ft.m2.q1.combined <- ft.m2.q1.combined %>%set_caption("Table. Adjusted model on association of PA with LBP by sex") %>%autofit() %>%bold(part ="header") %>%align(align ="center", part ="all")ft.m2.q1.combinedsave(m2.q1.combined, file ="../tables/models/m2.q1.combined.rda")flextable::flextable(m2.q1.combined) %>%set_caption("Table. Adjusted model on association of PA with LBP by sex") %>%autofit() %>%bold(part ="header") %>%align(align ="center", part ="all") %>% flextable::line_spacing(space =1.0) %>% flextable::fontsize(size =8, part ="all") %>% flextable::font(fontname ="Times New Roman", part ="all") %>% flextable::save_as_docx(path ="../tables/models/model2.q1.by.sex.docx")
Table 8: Model 2: Adjusted model on association of PA with LBP by sex.
LBP
Variable
Parameter
adjusted OR (male)
95% CI (male)
p value (male)
adjusted OR (female)
95% CI (female)
p value (female)
A little LBP
Physical activity level
Partially active
1.11
[0.77; 1.61]
0.568
1.03
[0.77; 1.38]
0.860
Physical activity level
Irregularly active
1.22
[0.86; 1.74]
0.261
0.99
[0.75; 1.31]
0.960
Physical activity level
Regularly active
1.19
[0.83; 1.73]
0.343
0.88
[0.66; 1.17]
0.375
Physical activity level
Trained
0.93
[0.66; 1.33]
0.705
0.73
[0.55; 0.97]
0.032
Age category
18-24 years
0.61
[0.43; 0.87]
0.007
1.20
[0.89; 1.62]
0.222
Age category
25-34 years
1.06
[0.81; 1.38]
0.679
1.17
[0.93; 1.48]
0.190
Age category
35-44 years
0.90
[0.72; 1.13]
0.373
0.93
[0.77; 1.14]
0.491
Age category
55-64 years
0.92
[0.75; 1.13]
0.419
0.91
[0.76; 1.1]
0.332
Age category
65-74 years
1.01
[0.81; 1.25]
0.964
0.83
[0.68; 1.01]
0.067
Age category
75+ years
0.99
[0.74; 1.32]
0.937
0.88
[0.66; 1.16]
0.351
BMI category
Underweight
0.94
[0.49; 1.79]
0.842
1.01
[0.77; 1.32]
0.933
BMI category
Overweight
0.83
[0.71; 0.97]
0.019
1.28
[1.1; 1.49]
0.001
BMI category
Obesity
1.18
[0.95; 1.46]
0.130
1.25
[1.01; 1.53]
0.037
Civil status
Married
0.89
[0.74; 1.08]
0.236
1.08
[0.91; 1.28]
0.394
Civil status
Divorced
1.00
[0.75; 1.33]
0.996
1.22
[0.96; 1.56]
0.100
Civil status
Widowed
1.17
[0.68; 2.03]
0.569
1.16
[0.82; 1.62]
0.401
Nationality
Foreigner
0.95
[0.8; 1.14]
0.589
1.03
[0.88; 1.22]
0.685
Language region
French-speaking Switzerland
1.15
[0.99; 1.34]
0.076
1.12
[0.98; 1.29]
0.108
Language region
Italian-speaking Switzerland
0.86
[0.68; 1.09]
0.219
0.99
[0.8; 1.21]
0.900
Education
Upper secondary education
0.99
[0.75; 1.31]
0.958
0.93
[0.75; 1.16]
0.511
Education
Tertiary level
0.78
[0.59; 1.03]
0.083
0.84
[0.67; 1.06]
0.145
Strong LBP
Physical activity level
Partially active
0.48
[0.28; 0.81]
0.006
0.70
[0.48; 1.03]
0.073
Physical activity level
Irregularly active
0.38
[0.23; 0.61]
0.000
0.56
[0.39; 0.82]
0.003
Physical activity level
Regularly active
0.43
[0.26; 0.71]
0.001
0.58
[0.39; 0.86]
0.007
Physical activity level
Trained
0.35
[0.21; 0.58]
0.000
0.35
[0.24; 0.53]
0.000
Age category
18-24 years
0.27
[0.11; 0.65]
0.003
1.02
[0.59; 1.75]
0.954
Age category
25-34 years
0.78
[0.44; 1.38]
0.387
1.38
[0.89; 2.15]
0.150
Age category
35-44 years
0.72
[0.44; 1.17]
0.180
1.28
[0.9; 1.83]
0.169
Age category
55-64 years
1.09
[0.72; 1.67]
0.680
1.16
[0.83; 1.61]
0.383
Age category
65-74 years
1.08
[0.69; 1.69]
0.734
0.78
[0.54; 1.13]
0.184
Age category
75+ years
0.84
[0.48; 1.49]
0.555
1.03
[0.64; 1.66]
0.909
BMI category
Underweight
2.20
[0.61; 7.96]
0.230
1.12
[0.69; 1.83]
0.653
BMI category
Overweight
0.86
[0.63; 1.17]
0.340
1.23
[0.95; 1.6]
0.114
BMI category
Obesity
1.68
[1.14; 2.46]
0.009
1.77
[1.29; 2.43]
0.000
Civil status
Married
1.36
[0.93; 1.99]
0.109
1.22
[0.88; 1.68]
0.227
Civil status
Divorced
1.45
[0.77; 2.74]
0.249
1.86
[1.22; 2.84]
0.004
Civil status
Widowed
1.02
[0.3; 3.47]
0.970
1.62
[0.95; 2.77]
0.078
Nationality
Foreigner
1.38
[0.96; 1.98]
0.085
1.18
[0.9; 1.54]
0.229
Language region
French-speaking Switzerland
1.12
[0.82; 1.51]
0.483
1.17
[0.93; 1.48]
0.173
Language region
Italian-speaking Switzerland
0.70
[0.41; 1.19]
0.187
0.82
[0.56; 1.19]
0.292
Education
Upper secondary education
2.27
[1.26; 4.08]
0.006
0.78
[0.56; 1.08]
0.139
Education
Tertiary level
1.17
[0.64; 2.13]
0.605
0.47
[0.32; 0.67]
0.000
12.4 Model 3: Adjusted model q2 including lifestyle factors and confounder, separated by sex
# weights are considered, stratification is not! - nnet cannot be used# nnet.model.pa <- nnet::multinom(lbp ~ pa_cat, data = as.data.frame(srvy.LBP.bin.conf.c), weights = weighting.tel)# par.nnet.model.lbp.pa <- parameters::parameters(nnet.model.pa, ci = 0.95, digits = 3, exponentiate = TRUE)# par.nnet.model.lbp.pa
weights necessary
mlogit(lbp ~ |pa_cat, data, #weights #strata) not used and possible with weighted survey data + stratification
Not used
svyglm model only applicable for binary outcomes (Only possible for lbp_bin)
lbp is not binary
Code
# survey designsurvey.LBP.bin.c <-svydesign(weights =~weighting.tel,strata =~strata,ids =~1,nest =TRUE,data = df.m.LBP.bin)# only possible using svyglm with lbp_binsurvey.model.pa <-svyglm(lbp ~ pa_cat, design = survey.LBP.bin.c, family =quasibinomial())par.survey.model.lbp.bin.pa <- parameters::parameters(survey.model.pa, ci =0.95, digits =3, exponentiate =TRUE) # having no LBP as reference levelsummary(survey.model.pa) # it treats lbp as a binary variable - not useful
Call:
svyglm(formula = lbp ~ pa_cat, design = survey.LBP.bin.c, family = quasibinomial())
Survey design:
svydesign(weights = ~weighting.tel, strata = ~strata, ids = ~1,
nest = TRUE, data = df.m.LBP.bin)
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.07876 0.09176 0.858 0.3907
pa_catPartially active -0.14724 0.10607 -1.388 0.1651
pa_catIrregularly active -0.20206 0.09985 -2.024 0.0430 *
pa_catRegularly active -0.23753 0.10486 -2.265 0.0235 *
pa_catTrained -0.53877 0.10030 -5.372 7.92e-08 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
(Dispersion parameter for quasibinomial family taken to be 1.000075)
Number of Fisher Scoring iterations: 4
Code
library(see) # for the plot() method from parametersplot.survey.model.lbp.bin <-plot(par.survey.model.lbp.bin.pa, show_labels =TRUE, size_text =4, show_intercept =TRUE)# export via ggsaveggsave("../figures/plot.model.lbp.bin.png", plot = plot.survey.model.lbp.bin, width =6, height =4, dpi =300)
Not used
Code
# It uses survey design object from survey packagelibrary(svyVGAM)library(parameters)vglm.m1 <-svy_vglm( lbp ~ pa_cat,family =multinomial(refLevel ="No"),design =as_survey_design(srvy.LBP.bin.c))summary(vglm.m1)