Vi har tagit data från 2020, eftersom två frågor tillkommit 2020.
Frågorna har delats in i tre tänkta områden, som markerats med bakgrundsfärg i tabellen med items längre ner:
eget bruk
debutålder
föräldrarna/familjen
Frågorna har stor variation i svarskategorierna, vilket beskrivs i PDF-filen med frågor, och även framgår om man klickar på vid denna sidas rubrik högst upp och tittar på källkoden till analysen där omkodning (“recode”) av svarskategorierna finns med tidigt i koden (innan denna text).
Exempel på vanliga typer av svarskategorier och deras omkodning:
‘Nej, jag har aldrig rökt’=0;
‘Nej, bara provat hur det smakar’=1;
‘Nej, jag har rökt men slutat’=2;
‘Ja, ibland men inte varje dag’=3;
‘Ja, dagligen’=4;
och:
‘Nej, ingen gång’=0;
‘Ja, 1 gång’=1;
‘Ja, 2-4 gånger’=2;
‘Ja, 5-10 gånger’=3;
‘Ja, 11-20 gånger’=4;
‘Ja, 21-50 gånger’=5;
‘Ja, mer än 50 gånger’=6;
Denna typ av frekvensskattningar med så många svarsalternativ brukar sällan ge psykometriskt meningsfull information, d.v.s. det är inte tillräckligt stor skillnad på de olika svarsalternativen för att var och en av kategorierna ska bidra med mera information om respondenten. Vi kommer med största sannolikhet behöva slå samman flera av dem för att kunna göra en rimlig analys.
För denna analys är målsättningen inte att undersöka möjligheten att ta fram ett eller flera indexvärden utifrån sammansättningar av items/frågor som sedan kan användas på samtliga deltagare. Detta beror på att de flesta deltagare har såpass liten användning av substanser eller ens har svarat på frågorna. Däremot vill vi se hur frågorna fungerar relativt varandra (item-hierarki) och om det skiljer sig mellan kön, årskurs och över tid.
Code
itemlabels %>%kbl(booktabs = T, escape = F) %>%# bootstrap options are for HTML outputkable_styling(bootstrap_options =c("striped", "hover"), position ="left",full_width = F,font_size = r.fontsize,fixed_thead = T) %>%# when there is a long list in the table# column_spec(c(2:3), color = "red") %>% row_spec(1:9, bold = F, color ="black", background ="lightblue") %>%row_spec(10:14, bold = F, color ="white", background = RISEprimGreen) %>%row_spec(15:19, bold = F, color ="white", background = RISEcompPurple) %>%column_spec(1, bold = T) %>%kable_classic(html_font ="Lato")
itemnr
item
F14
Röker du?
FNY12020
Röker du e-cigaretter?
F18
Snusar du?
F34
Hur ofta dricker du vid ett och samma tillfälle alkohol motsvarande minst 18cl sprit?
F41
Har du sniffat/boffat någon gång?
F47
Hur många gånger totalt har du använt hasch/marijuana?
F48
Hur många gånger totalt har du använt annan narkotika än hasch/marijuana?
f53
Har du det senaste läsåret varit i kontakt med någon hjälpinstans p.g.a alkohol eller droger?
F73
Hur mycket pengar har du spelat för de senaste 30 dagarna?
F16
Hur gammal var du första gången du rökte?
F20
Hur gammal var du första gången du snusade?
F37
Hur gammal var du första gången du kände dig berusad?
F44
Hur gammal var du första gången du sniffade/boffade?
F51
Hur gammal var du första gången du använde narkotika?
F17
Får du röka för dina föräldrar?
F21
Får du snusa för dina föräldrar?
f22
Använder någon i din familj tobak (röker eller snusar)?
F40
Får du dricka alkohol för dina föräldrar?
FNY22020
Får du satsa pengar på spel för dina föräldrar?
10.2 Bortfall i data
Eftersom ANDTS-frågorna har större bortfall i svar kommer vi inte helt filtrera bort respondenter med saknade svar.
Code
RIlistItemsMargin(df.omit.na, 11)
itemnr
item
F14
Röker du?
FNY12020
Röker du e-cigaretter?
F18
Snusar du?
F34
Hur ofta dricker du vid ett och samma tillfälle alkohol motsvarande minst 18cl sprit?
F41
Har du sniffat/boffat någon gång?
F47
Hur många gånger totalt har du använt hasch/marijuana?
F48
Hur många gånger totalt har du använt annan narkotika än hasch/marijuana?
f53
Har du det senaste läsåret varit i kontakt med någon hjälpinstans p.g.a alkohol eller droger?
F73
Hur mycket pengar har du spelat för de senaste 30 dagarna?
F16
Hur gammal var du första gången du rökte?
F20
Hur gammal var du första gången du snusade?
F37
Hur gammal var du första gången du kände dig berusad?
F44
Hur gammal var du första gången du sniffade/boffade?
F51
Hur gammal var du första gången du använde narkotika?
F17
Får du röka för dina föräldrar?
F21
Får du snusa för dina föräldrar?
f22
Använder någon i din familj tobak (röker eller snusar)?
F40
Får du dricka alkohol för dina föräldrar?
FNY22020
Får du satsa pengar på spel för dina föräldrar?
Code
#---- Create a figure showing % of missing data for each item, based on the complete dataset----df.omit.na %>%select(itemlabels$itemnr) %>%t() %>%as.data.frame() %>%mutate(Missing =rowSums(is.na(.))) %>%select(Missing) %>%arrange(desc(Missing)) %>%rownames_to_column(var ="Item") %>%mutate(Percentage = Missing/nrow(df)*100) %>%mutate(Item =factor(Item, levels =rev(Item))) %>%ggplot(aes(x = Item, y = Percentage)) +geom_col() +coord_flip() +ggtitle("Missing data per item") +xlab("Items") +ylab("Percentage of responses missing")
Efter att ha tagit bort respondenter med färre än 12 items besvarade ser bortfallet ut enligt nedan.
Code
#---- Filtering participants based on missing data----# If you want to include participants with missing data, input the minimum number of items responses that a participant should have to be included in the analysis:min.responses <-12# Select the variables we will work with, and filter out respondents with a lot of missing datadf.omit.na <- df.omit.na %>%filter(length(itemlabels$itemnr)-rowSums(is.na(.[itemlabels$itemnr])) >= min.responses)# create DIF variables for gender and gradedif.gender <- df.omit.na$Köndf.omit.na$Kön <-NULLdif.arskurs <- df.omit.na$ARSKURSdf.omit.na$ARSKURS <-NULLdif.stadsdel <- df.omit.na$SkolSDOdf.omit.na$SkolSDO <-NULLdf.omit.na %>%select(itemlabels$itemnr) %>%t() %>%as.data.frame() %>%mutate(Missing =rowSums(is.na(.))) %>%select(Missing) %>%arrange(desc(Missing)) %>%rownames_to_column(var ="Item") %>%mutate(Percentage = Missing/nrow(df)*100) %>%mutate(Item =factor(Item, levels =rev(Item))) %>%ggplot(aes(x = Item, y = Percentage)) +geom_col() +coord_flip() +ggtitle("Missing data per item") +xlab("Items") +ylab("Percentage of responses missing")
Code
n2020 <- df %>%filter(ar =="2020") %>%nrow()
Vi har 3978 respondenter i data, av totalt 13065 respondenter för år 2020. Det innebär att samplet vi analyserar består av den delen som använder olika typer av substanser. Vi kan senare jämföra dem med de som filtrerats ut.
Eftersom frekvensbaserade svarskategorier använts, som ofta har mindre psykometriskt meningsfulla skillnader mellan de högre kategorierna, behöver vi först titta på om de behöver slås samman.
Code
plot(mirt.rasch, type="trace")
Vi ser många problem här som behöver åtgärdas:
F14 - kategori 2 slås samman med kategori 3
FNY12020 - slår samman de tre högsta
F18 - slår samman 2+1 och 3+4
F34 - slår samman 1+2
F41 - tas bort - mycket få svar över 0
F47 - vi slår samman 3+4 och 5+6
F48 - dikotomiseras mellan 0 och övriga kategorier
F73 - vi slår samman mittenkategorierna 1-5, och låter 0 och 6 vara kvar.
Relative cut-off value (highlighted in red) is 0.061, which is 0.2 above the average correlation.
Code
RItargeting(df.eget)
Code
RIitemHierarchy(df.eget)
Vi kan se att de två högsta svarskategorierna för F47 behöver slås samman, de är oordnade. Det är också tydligt att F73 har hög item fit och behöver tas bort.
Här sker en del intressanta förändringar över tid hos samtliga items.
10.7 Debutålder
Här är det förmodligen mest intressant att ta fram medelvärde, median, och spridningsmått, samt visualiseringar.
Det finns dock låga svar som är tvivelaktiga att ta med. När frågor om debutålder besvaras med exempelvis intervallet 0-4 år förefaller det osannolikt att svaret är uppriktigt.
Eftersom frågan ställs till både åk 9 och årskurs 2 på gymnasiet verkar det mest relevant att enbart redovisa rapporteringen som görs när eleverna är äldre.
Hur gammal var du första gången du kände dig berusad?
F44
Hur gammal var du första gången du sniffade/boffade?
F51
Hur gammal var du första gången du använde narkotika?
Code
#---- Create a figure showing % of missing data for each item, based on the complete dataset----df.debut %>%t() %>%as.data.frame() %>%mutate(Missing =rowSums(is.na(.))) %>%select(Missing) %>%arrange(desc(Missing)) %>%rownames_to_column(var ="Item") %>%mutate(Percentage = Missing/nrow(df)*100) %>%mutate(Item =factor(Item, levels =rev(Item))) %>%ggplot(aes(x = Item, y = Percentage)) +geom_col() +coord_flip() +ggtitle("Missing data per item") +xlab("Items") +ylab("Percentage of responses missing")
Enbart de som besvarat åtminstone tre av de fem frågorna kan vara med i analysen.
Code
# If you want to include participants with missing data, input the minimum number of items responses that a participant should have to be included in the analysis:min.responses <-3# Select the variables we will work with, and filter out respondents with a lot of missing datadf.deb2 <- df.debdist %>%filter(length(itemsANDTSdebut)-rowSums(is.na(.[itemsANDTSdebut])) >= min.responses) %>%select(any_of(itemsANDTSdebut))
Detta reducerar sampelstorleken från 3978 till 15283 respondenter.
10.7.6 Svarskategorier
Code
RIallresp(df.deb2)
Response category
Number of responses
Percent
9.0
486
0.6
10.0
1011
1.3
11.0
1774
2.3
12.0
4953
6.5
13.0
8670
11.3
13.5
1
0.0
14.0
12253
16.0
15.0
11593
15.2
16.0
7005
9.2
16.5
1
0.0
17.0
3624
4.7
18.0
491
0.6
19.0
136
0.2
20.0
4
0.0
NA
24413
31.9
Vi slår samman alla upp till 11 år i samma kategori, som betecknas med siffran 0, därefter blir 12 år = kategori 1, 13 år = 2, och så vidare upp till 18-20 år = 7.
Enbart item F16 (rökning) uppvisar ordnade svarskategorier. Vi går ändå vidare och tittar på andra parametrar innan några eventuella åtgärder görs.
Det är dock svårt att få modellen att konvergera, vilket också bekräftar att debutålder inte är meningsfullt att bygga något index av.
10.8 Explorativa indexberäkningar och visualisering
Smolkowski och kollegor (smolkowski2006?) skriver på sidan 241: “We created an index of substance use by summing the number of reported substances used in the last month: cigarettes, alcohol, marijuana, or any of the other drugs.”
Det ter sig lite märkligt att inte alls vikta substanserna, men vi kan prova ett liknande upplägg.
Vi har fem items som kan användas, som avser tobaksrökning, snus, alkohol, narkotika (inkl cannabis), samt e-cigaretter. Dock har den sistnämna enbart funnits sedan 2020, så den utelämnas tills vi har hittat ett sätt att se till att den inte förvränger jämförbarheten över tid. Det kan ev. vara lämpligt att på något vis integrera tobaksanvändning, oavsett form.
Fråga 37 (f36 i data), Hur många gånger har du druckit så mycket alkohol att du känt dig berusad under den senaste 4-veckorsperioden? Fördelningen av svaren är märklig, se histogram nedan
Code
hist(as.numeric(df$f36), col = RISEprimGreen)
Vi kodar om enligt: “4:12=3;13:31=NA”
Code
hist(df$f36r, col = RISEprimGreen)
Samma sak gäller frågan om narkotika-användning.
Hur många gånger har du använt narkotika (cannabis eller annan narkotika) den senaste 4-veckors perioden?
Code
hist(as.numeric(df$F49), col = RISEprimGreen)
Omkodning: “4:12=3;13:100=NA”
Code
hist(df$F49r, col = RISEprimGreen)
Item F14 är inte formulerad enligt samma tydliga frekvensfråga som de två tidigare frågorna. Den har sedan tidigare kodats enligt nedan:
recode(df$F14,“‘Nej, jag har aldrig rökt’=0; ‘Nej, bara provat hur det smakar’=1; ‘Nej, jag har rökt men slutat’=2; ‘Ja, ibland men inte varje dag’=3; ‘Ja, dagligen’=4; ‘’=NA”, as.factor = F)
Och inför test av index kodas den “0:2=0;3=1;4=2”
Code
hist(df$F14r, col = RISEprimGreen)
Samma gäller FNY12020 (e-cigaretter)
recode(df$FNY12020,“‘Nej, jag har aldrig rökt e-cigaretter’=0; ‘Nej, bara provat hur det smakar’=1; ‘Nej, jag har rökt e-cigaretter men slutat’=2; ‘Ja, ibland men inte varje dag’=3; ‘Ja, dagligen’=4; ‘’=NA”, as.factor = F)
Som blir “0:2=0;3=1;4=2”
Code
hist(df$FNY12020r, col = RISEprimGreen)
Och även F18 för snus.
Code
hist(df$F18r, col = RISEprimGreen)
10.8.1 Separerade på respektive substans
Code
# for FNY12020r and F14r (e-cig and smoking)itemlabelsPlotFaktor <-cbind(senaste4v,c("Rökning","Snus","Alkohol","Narkotika (inkl. cannabis)","E-cigaretter")) %>%as.data.frame() %>%rename(itemnr = senaste4v,item = V2)andtsUseShare <-function(andts) { plotFaktor <- andts plotFaktorName <- itemlabelsPlotFaktor %>%filter(itemnr == plotFaktor) %>%pull(item) df %>%filter(Kön %in%c("Pojke", "Flicka"),!ARSKURS =="<NA>") %>%select(all_of(senaste4v), ar, Kön, ARSKURS) %>%mutate(bruk4v =case_when( .data[[plotFaktor]] ==0~"Ej använt", .data[[plotFaktor]] ==1~"Ibland men inte varje dag", .data[[plotFaktor]] ==2~"Dagligen",TRUE~"Svar saknas" ) ) %>%mutate(bruk4v =factor(bruk4v, levels =c("Dagligen","Ibland men inte varje dag","Ej använt","Svar saknas"))) %>%group_by(ar, Kön, ARSKURS) %>%count(bruk4v, .drop =FALSE) %>%mutate(Andel = (100* n /sum(n)) %>%round(digits =1)) %>%ggplot(aes(x = ar, y = Andel)) +geom_area(aes(fill = bruk4v),position ="stack",alpha =0.85 ) +scale_fill_manual(values =c("#D55E00", "#F0E442", "#009E73", "lightgrey")) +scale_y_continuous(breaks =c(0, 20, 40, 60, 80, 100)) +scale_x_continuous(breaks = årtal, guide =guide_axis(n.dodge =2)) +xlab("Årtal") +ylab("Andel i %") +theme(axis.text.x =element_text(size = ax.size, family ="sans"),axis.text.y =element_text(size = ax.size, family ="sans"),title =element_text(size = title.size),legend.text =element_text(size = legend.size),strip.text.x =element_text(size =14),panel.spacing =unit(0.5, "cm", data =NULL) ) +labs(title =paste0(plotFaktorName),subtitle ="Uppdelat på kön" ) +facet_grid(ARSKURS ~ Kön)}
Om vi slår samman “F14r”,“F18r”,“F36new”,“F49new”,“FNY12020r” kan man max ha 2+2+3+3+3 = 12
Code
hist(df$Senaste4v, col = RISEprimGreen)
Code
df %>%count(Senaste4v) %>%formattable()
Senaste4v
n
0
63514
1
12001
2
10284
3
8489
4
5579
5
3968
6
1901
7
743
8
382
9
181
10
88
11
3
12
2
Dock finns ingen viktning i ovanstående, så allt bruk likställs, utöver att det går att rapportera högre nivå av alkohol och narkotika, där det är viktigt att notera att den sistnämna inkluderar cannabis.
Code
df %>%select(all_of(senaste4v)) %>%pivot_longer(everything()) %>%ggplot(aes(x = value, fill = name)) +geom_histogram()
F14r = rökning F18r = snus f36r = alkohol F49r = narkotika (cannabis eller annan narkotika) GNY12020r = e-cigaretter
Ovanstående är alla år sammanslaget. Nedan fördelat på årtal.
10.8.2.1 Test visualisering oviktat index “Bruk senaste 4v”
Utifrån siffrorna i tabellen tidigare ter det sig rimligt att slå samman de som har värden på 6 eller mer. Vi ska också testa att gruppera de som har x antal bruk.
E-cigaretter ej med pga enbart data från 2020. Snusning finns ej med, kan läggas till om så önskas.
Code
plotFaktor ="Senaste4v"df %>%filter(Kön %in%c("Pojke", "Flicka"),!ARSKURS =="<NA>") %>%select(all_of(senaste4v), Senaste4v, ar, Kön, ARSKURS) %>%mutate(bruk4v =case_when( Senaste4v ==0~"Ej använt", F14r ==1| F36new ==1| F49new ==1~"En substans en gång", F14r >=1& F36new >=1~"Rökning och alkohol en gång eller oftare", F14r >=1& F49new >=1~"Rökning och narkotika en gång eller oftare", F36new >=1& F49new >=1~"Alkohol och narkotika en gång eller oftare", F14r >=1& F36new >=1& F49new >=1~"Alla tre substanser en gång eller oftare",TRUE~"Svar saknas" ) ) %>%mutate(bruk4v =recode(bruk4v,"NA='Svar saknas'")) %>%mutate(bruk4v =factor(bruk4v, levels =c("Alla tre substanser en gång eller oftare","Alkohol och narkotika en gång eller oftare","Rökning och narkotika en gång eller oftare","Rökning och alkohol en gång eller oftare","En substans en gång","Ej använt","Svar saknas") )) %>%select(bruk4v,ar,Kön,ARSKURS) %>%group_by(ar, Kön, ARSKURS) %>%count(bruk4v, .drop =FALSE) %>%mutate(Andel = (100* n /sum(n)) %>%round(digits =1)) %>%ggplot(aes(x = ar, y = Andel)) +geom_area(aes(fill = bruk4v),position ="stack",alpha =0.85 ) +scale_fill_viridis_d(labels =function(x) str_wrap(x, width =14)) +scale_y_continuous(breaks =c(0, 20, 40, 60, 80, 100)) +scale_x_continuous(breaks = årtal, guide =guide_axis(n.dodge =2)) +xlab("Årtal") +ylab("Andel i %") +theme(axis.text.x =element_text(size = ax.size, family ="sans"),axis.text.y =element_text(size = ax.size, family ="sans"),title =element_text(size = title.size),legend.text =element_text(size = legend.size),strip.text =element_text(size =12),panel.spacing =unit(0.5, "cm", data =NULL) ) +labs(title =paste0("Blandbruk, användning senaste 4 veckorna"),subtitle ="Uppdelat på kön" ) +facet_grid(ARSKURS ~ Kön)
10.8.4 Utan icke-brukare/saknade svar
Code
df %>%filter(Kön %in%c("Pojke", "Flicka"),!ARSKURS =="<NA>") %>%select(all_of(senaste4v), Senaste4v, ar, Kön, ARSKURS) %>%mutate(bruk4v =case_when( Senaste4v ==0~"Ej använt", F14r ==1~"Enbart rökning", F36new ==1~"Enbart alkohol", F49new ==1~"Enbart narkotika", F14r >=1& F36new >=1~"Rökning och alkohol en gång eller oftare", F14r >=1& F49new >=1~"Rökning och narkotika en gång eller oftare", F36new >=1& F49new >=1~"Alkohol och narkotika en gång eller oftare", F14r >=1& F36new >=1& F49new >=1~"Alla tre substanser en gång eller oftare",TRUE~"Svar saknas" ) ) %>%mutate(bruk4v =recode(bruk4v,"'Svar saknas'=NA;'Ej använt'=NA")) %>%mutate(bruk4v =factor(bruk4v, levels =c("Alla tre substanser en gång eller oftare","Alkohol och narkotika en gång eller oftare","Rökning och narkotika en gång eller oftare","Rökning och alkohol en gång eller oftare","Enbart narkotika","Enbart alkohol","Enbart rökning") )) %>%filter(!is.na(bruk4v)) %>%select(bruk4v,ar,Kön,ARSKURS) %>%group_by(ar, Kön, ARSKURS) %>%count(bruk4v, .drop =FALSE) %>%mutate(Andel = (100* n /sum(n)) %>%round(digits =1)) %>%ggplot(aes(x = ar, y = Andel)) +geom_area(aes(fill = bruk4v),position ="stack",alpha =0.85 ) +#scale_fill_manual(values = c("#D55E00", "orange", "#F0E442", "#009E73", "lightgrey")) +scale_fill_viridis_d(labels =function(x) str_wrap(x, width =14)) +scale_y_continuous(breaks =c(0, 20, 40, 60, 80, 100)) +scale_x_continuous(breaks = årtal, guide =guide_axis(n.dodge =2)) +xlab("Årtal") +ylab("Andel i %") +theme(axis.text.x =element_text(size = ax.size, family ="sans"),axis.text.y =element_text(size = ax.size, family ="sans"),title =element_text(size = title.size),legend.text =element_text(size = legend.size),strip.text =element_text(size =12),panel.spacing =unit(0.5, "cm", data =NULL) ) +labs(title =paste0("Blandbruk, användning senaste 4 veckorna"),subtitle ="Uppdelat på kön" ) +facet_grid(ARSKURS ~ Kön)
10.8.5 Tabell
Code
library(gt)library(gtExtras)andtsTable <-function(year) {df %>%filter(Kön %in%c("Pojke", "Flicka"),!ARSKURS =="<NA>") %>%filter(ar == year) %>%select(all_of(senaste4v), Senaste4v, ar, Kön, ARSKURS) %>%# mutate(# bruk4v = case_when(# Senaste4v == 0 ~ "Ej använt",# F14r == 1 | F36new == 1 | F49new == 1 ~ "En substans en gång",# F14r > 1 & F36new > 1 ~ "Rökning och alkohol mer än en gång",# F14r > 1 & F49new > 1 ~ "Rökning och narkotika mer än en gång",# F36new > 1 & F49new > 1 ~ "Alkohol och narkotika mer än en gång",# F14r > 1 & F36new > 1 & F49new > 1 ~ "Alla tre substanser mer än en gång",# TRUE ~ "Svar saknas"# )# ) %>% # mutate(bruk4v = recode(bruk4v,"NA='Svar saknas'")) %>% # mutate(bruk4v = factor(bruk4v, levels = c("Alla tre substanser mer än en gång",# "Alkohol och narkotika mer än en gång",# "Rökning och narkotika mer än en gång",# "Rökning och alkohol mer än en gång",# "En substans en gång",# "Ej använt",# "Svar saknas")# )) %>% mutate(bruk4v =case_when( Senaste4v ==0~"Ej använt", F14r ==1~"Enbart rökning", F36new ==1~"Enbart alkohol", F49new ==1~"Enbart narkotika", F14r >=1& F36new >=1~"Rökning och alkohol en gång eller oftare", F14r >=1& F49new >=1~"Rökning och narkotika en gång eller oftare", F36new >=1& F49new >=1~"Alkohol och narkotika en gång eller oftare", F14r >=1& F36new >=1& F49new >=1~"Alla tre substanser en gång eller oftare",TRUE~"Svar saknas" ) ) %>%mutate(bruk4v =recode(bruk4v,"'Svar saknas'=NA;'Ej använt'=NA")) %>%mutate(bruk4v =factor(bruk4v, levels =c("Alla tre substanser en gång eller oftare","Alkohol och narkotika en gång eller oftare","Rökning och narkotika en gång eller oftare","Rökning och alkohol en gång eller oftare","Enbart narkotika","Enbart alkohol","Enbart rökning") )) %>%select(bruk4v,ar,Kön,ARSKURS) %>%group_by(ar, ARSKURS, Kön) %>%count(bruk4v, .drop =FALSE) %>%mutate(Andel = (100* n /sum(n)) %>%round(digits =1)) %>%rename(År = ar, Årskurs = ARSKURS,Bruk = bruk4v) %>%gt(.,groupname_col =c("Årskurs","Kön"),rowname_col ="År") %>%gt_theme_espn() %>%tab_options(table.font.name ="Lato",container.width =500,heading.align ="left") %>%cols_align(align ="right")}
Relative cut-off value (highlighted in red) is 0.115, which is 0.2 above the average correlation.
Code
RItargeting(df.fldr)
Code
RIitemHierarchy(df.fldr)
Som väntat passar inte f22 in bland övriga frågor, vilket syns tydligt på figuren med faktorladdning på första residualkontrasten.
Gällande residualkorrelationer finns ett mycket starkt samband mellan röka och snusa. Det finns även ett samband mellan snusa och alkohol som är något över gränsvärdet.
Vi tar bort f22 och tittar på svarskategorier för övriga frågor
Code
df.fldr$f22 <-NULL
10.9.2 Svarskategorier
Code
plot(mirt.rasch, type="trace")
Att koda “Vet ej” som mitten på svarsskalan var ett test, och det verkar ha fungerat acceptabelt förutom för F40. Vi kodar om “Vet ej” som missing/NA.
Det är inte möjligt att ta fram något indexvärde, men det bör vara möjligt att ta fram en variabel som säger något om föräldrarnas tillåtande attityd, vilket är en känd riskfaktor för bruk av ANDTS.
En utgångspunkt kan vara ett gränsvärdet på person location -1.5, utifrån item-parametrarna i tabellen ovan.
Code
df.fldr$FLDRscore <-RIestThetas2(df.fldr, cpu =8)hist(df.fldr$FLDRscore, col = RISEprimGreen)
Mair and Hatzinger (2007b); Mair and Hatzinger (2007a); Hatzinger and Rusch (2009); Rusch, Maier, and Hatzinger (2013); Koller, Maier, and Hatzinger (2015); Debelak and Koller (2019); Mair, Hatzinger, and Maier (2021)
Trepte and Verbeet (2010); Strobl, Wickelmaier, and Zeileis (2011); Strobl, Kopf, and Zeileis (2015); Komboz, Zeileis, and Strobl (2018); Wickelmaier and Zeileis (2018)
Allaire, JJ, Yihui Xie, Jonathan McPherson, Javier Luraschi, Kevin Ushey, Aron Atkins, Hadley Wickham, Joe Cheng, Winston Chang, and Richard Iannone. 2023. Rmarkdown: Dynamic Documents for r. https://github.com/rstudio/rmarkdown.
Chalmers, R. Philip. 2012. “mirt: A Multidimensional Item Response Theory Package for the R Environment.”Journal of Statistical Software 48 (6): 1–29. https://doi.org/10.18637/jss.v048.i06.
Debelak, Rudolf, and Ingrid Koller. 2019. “Testing the Local Independence Assumption of the Rasch Model With Q3-Based Nonparametric Model Tests.”Applied Psychological Measurement. https://doi.org/10.1177/0146621619835501.
Koller, Ingrid, Marco Johannes Maier, and Reinhold Hatzinger. 2015. “An Empirical Power Analysis of Quasi-Exact Tests for the Rasch Model: Measurement Invariance in Small Samples.”Methodology 11. https://doi.org/10.1027/1614-2241/a000090.
Komboz, Basil, Achim Zeileis, and Carolin Strobl. 2018. “Tree-Based Global Model Tests for Polytomous Rasch Models.”Educational and Psychological Measurement 78 (1): 128–66. https://doi.org/10.1177/0013164416664394.
Mair, Patrick, and Reinhold Hatzinger. 2007a. “CML based estimation of extended Rasch models with the eRm package in R.”Psychology Science 49.
———. 2007b. “Extended Rasch modeling: The eRm package for the application of IRT models in R.”Journal of Statistical Software 20. https://www.jstatsoft.org/v20/i09.
R Core Team. 2022. R: A Language and Environment for Statistical Computing. Vienna, Austria: R Foundation for Statistical Computing. https://www.R-project.org/.
Revelle, William. 2022. Psych: Procedures for Psychological, Psychometric, and Personality Research. Evanston, Illinois: Northwestern University. https://CRAN.R-project.org/package=psych.
Richardson, Neal, Ian Cook, Nic Crane, Dewey Dunnington, Romain François, Jonathan Keane, Dragoș Moldovan-Grünfeld, Jeroen Ooms, and Apache Arrow. 2022. Arrow: Integration to ’Apache’ ’Arrow’. https://CRAN.R-project.org/package=arrow.
Rodríguez-Sánchez, Francisco, Connor P. Jackson, and Shaurita D. Hutchins. 2022. Grateful: Facilitate Citation of r Packages. https://github.com/Pakillo/grateful.
Rusch, Thomas, Marco Johannes Maier, and Reinhold Hatzinger. 2013. “Linear logistic models with relaxed assumptions in R.” In Algorithms from and for Nature and Life, edited by Berthold Lausen, Dirk van den Poel, and Alfred Ultsch. Studies in Classification, Data Analysis, and Knowledge Organization. New York: Springer. https://doi.org/10.1007/978-3-319-00035-0_34.
Strobl, Carolin, Julia Kopf, and Achim Zeileis. 2015. “Rasch Trees: A New Method for Detecting Differential Item Functioning in the Rasch Model.”Psychometrika 80 (2): 289–316. https://doi.org/10.1007/s11336-013-9388-3.
Strobl, Carolin, Florian Wickelmaier, and Achim Zeileis. 2011. “Accounting for Individual Differences in Bradley-Terry Models by Means of Recursive Partitioning.”Journal of Educational and Behavioral Statistics 36 (2): 135–53. https://doi.org/10.3102/1076998609359791.
Trepte, Sabine, and Markus Verbeet, eds. 2010. Allgemeinbildung in Deutschland – Erkenntnisse Aus Dem SPIEGELStudentenpisa-Test. Wiesbaden: VS Verlag.
Wickelmaier, Florian, and Achim Zeileis. 2018. “Using Recursive Partitioning to Account for Parameter Heterogeneity in Multinomial Processing Tree Models.”Behavior Research Methods 50 (3): 1217–33. https://doi.org/10.3758/s13428-017-0937-z.
Wickham, Hadley. 2007. “Reshaping Data with the Reshape Package.”Journal of Statistical Software 21 (12). https://www.jstatsoft.org/v21/i12/.
Wickham, Hadley, Mara Averick, Jennifer Bryan, Winston Chang, Lucy D’Agostino McGowan, Romain François, Garrett Grolemund, et al. 2019. “Welcome to the tidyverse.”Journal of Open Source Software 4 (43): 1686. https://doi.org/10.21105/joss.01686.
Xie, Yihui. 2014. “Knitr: A Comprehensive Tool for Reproducible Research in R.” In Implementing Reproducible Computational Research, edited by Victoria Stodden, Friedrich Leisch, and Roger D. Peng. Chapman; Hall/CRC.
———. 2015. Dynamic Documents with R and Knitr. 2nd ed. Boca Raton, Florida: Chapman; Hall/CRC. https://yihui.org/knitr/.
———. 2023. Knitr: A General-Purpose Package for Dynamic Report Generation in r. https://yihui.org/knitr/.
Xie, Yihui, J. J. Allaire, and Garrett Grolemund. 2018. R Markdown: The Definitive Guide. Boca Raton, Florida: Chapman; Hall/CRC. https://bookdown.org/yihui/rmarkdown.
---title: "ANDTS"title-block-banner: "#009ca6"title-block-banner-color: "#FFFFFF"author: name: Magnus Johansson affiliation: RISE Research Institutes of Sweden affiliation-url: https://ri.se/shic orcid: 0000-0003-1669-592Xdate: last-modifiedformat: html: toc: true toc-depth: 4 toc-title: "Innehållsförteckning" embed-resources: true standalone: true page-layout: full logo: rise_logo_quarto.png mainfont: 'Lato' monofont: 'Roboto Mono' code-overflow: wrap code-tools: true code-fold: true number-sections: true #fig-dpi: 250 layout-align: left linestretch: 1.6 theme: materia pdf: papersize: a4 documentclass: article #article, report or book classoption: [twocolumn, portrait] revealjs: theme: default logo: rise_logo_quarto.png chalkboard: false self-contained: true# footer: 'Material skapat av magnus.p.johansson@ri.se' mainfont: 'Lato' slide-level: 4 scrollable: true smaller: falseexecute: echo: true warning: false message: false cache: trueeditor_options: markdown: wrap: 72 chunk_output_type: inlinebibliography: grateful-refs.bib---```{r}#| include: falselibrary(arrow)library(ggrepel)library(car)library(grateful) # devtools::install_github("Pakillo/grateful")library(kableExtra)library(readxl)library(tidyverse)library(eRm)library(mirt)library(psych)library(ggplot2)library(psychotree)library(matrixStats)library(reshape)library(knitr)library(cowplot)library(formattable) library(RISEkbmRasch) # devtools::install_github("pgmj/RISEkbmRasch")library(glue)library(foreach)### set up color palette based on RISE guidelinesRISEprimGreen <-"#009ca6"RISEprimRed <-"#e83c63"RISEprimYellow <-"#ffe500"RISEprimGreenMid <-"#8dc8c7"RISEprimRedMid <-"#f5a9ab"RISEprimYellowMid <-"#ffee8d"RISEprimGreenLight <-"#ebf5f0"RISEprimRedLight <-"#fde8df"RISEprimYellowLight <-"#fff7dd"RISEcompPurple <-"#482d55"RISEcompGreenDark <-"#0e4e65"RISEgrey1 <-"#f0f0f0"RISEgrey2 <-"#c8c8c8"RISEgrey3 <-"#828282"RISEgrey4 <-"#555555"# set some colors used latercutoff_line <- RISEprimReddot_color <-"black"backg_color <- RISEprimGreenLight# set fontsize for all tablesr.fontsize <-15### first we pre-set our chosen cut-off values for some commonly used indices:msq_min <-0.7msq_max <-1.3zstd_min <--2zstd_max <-2loc_dep <-0.2# above average residual correlationdif_dif <-0.5# logits difference between groups in average item location (DIF)### zstd is inflated with large samples (N > 500). Reduce sample size to jz and ### run analysis yz random samples to get average ZSTDjz =300# number to include in datasetyz =10# number of random samples### for ggplotårtal <-c(2006,2008,2010,2012,2014,2016,2018,2020,2022)ax.size <-10title.size <-12legend.size <-10stript.size <-10### some commands exist in multiple packages, here we define preferred ones that are frequently usedselect <- dplyr::selectcount <- dplyr::countrecode <- car::recoderename <- dplyr::rename# import item informationitemlabels <-read_excel("ANDTSitemlabels.xls")df.all <-read_parquet("../../data/2022-09-18 sthlmsenkat recoded responses.parquet")df <- df.allitemsANDTSegen <-c("F14","FNY12020","F18","F34","F41","F47","F48","f53a","F73")itemsANDTSdebut <-c("F16","F20","F37","F44","F51")itemsANDTSfldr <-c("F17","F21","f22a","F40","FNY22020")# subset items before recoding if we need the uncoded data later ondf.andts <- df %>%select(all_of(c(itemsANDTSdebut,itemsANDTSegen,itemsANDTSfldr)))df$F14 <-recode(df$F14,"'Nej, jag har aldrig rökt'=0; 'Nej, bara provat hur det smakar'=1; 'Nej, jag har rökt men slutat'=2; 'Ja, ibland men inte varje dag'=3; 'Ja, dagligen'=4; '<NA>'=NA", as.factor = F)df$F14r <-recode(df$F14,"0:2=0;3=1;4=2") # possible part of frequency based indexdf$FNY12020 <-recode(df$FNY12020,"'Nej, jag har aldrig rökt e-cigaretter'=0; 'Nej, bara provat hur det smakar'=1; 'Nej, jag har rökt e-cigaretter men slutat'=2; 'Ja, ibland men inte varje dag'=3; 'Ja, dagligen'=4; '<NA>'=NA", as.factor = F)df$FNY12020r <-recode(df$FNY12020,"0:2=0;3=1;4=2")df$F18 <-recode(df$F18,"'Nej, jag har aldrig snusat'=0; 'Nej, bara provat hur det smakar'=1; 'Nej, jag har snusat men slutat'=2; 'Ja, ibland men inte varje dag'=3; 'Ja, dagligen'=4; '<NA>'=NA", as.factor = F)df$F18r <-recode(df$F18,"0:2=0;3=1;4=2")df$F34 <-recode(df$F34,"'Dricker inte alkohol'=0; 'Aldrig'=0; 'Ytterst sällan'=1; 'Någon gång per år'=2; 'Någon gång i månaden'=3; 'Ett par gånger i månaden'=4; 'Någon gång i veckan'=5; '<NA>'=NA", as.factor = F)df$F41 <-recode(df$F41,"'Nej, ingen gång'=0; 'Ja, 1 gång'=1; 'Ja, 2-4 gånger'=2; 'Ja, 5-10 gånger'=3; 'Ja, 11-20 gånger'=4; 'Ja, 21-50 gånger'=5; 'Ja, mer än 50 gånger'=6; '<NA>'=NA", as.factor = F)df$F47 <-recode(df$F47,"'Ingen gång'=0; '1 gång'=1; '2-4 gånger'=2; '5-10 gånger'=3; '11-20 gånger'=4; '21-50 gånger'=5; 'Mer än 50 gånger'=6; '<NA>'=NA", as.factor = F)df$F48 <-recode(df$F48,"'Ingen gång'=0; '1 gång'=1; '2-4 gånger'=2; '5-10 gånger'=3; '11-20 gånger'=4; '21-50 gånger'=5; 'Mer än 50 gånger'=6; '<NA>'=NA", as.factor = F)# f53-frågorna handlar om huruvida man sökt hjälp, och vi skiljer ej på var man sökt hjälp, # bara om man sökt hjälp (1) eller ej (0)df <- df %>%mutate(f53 =case_when( f53a =="Chosen"~0, f53b =="Chosen"~1, f53c =="Chosen"~1, f53d =="Chosen"~1, f53e =="Chosen"~1, f53f =="Chosen"~1,TRUE~NA_real_) )df$F73 <-recode(df$F73,"'Har inte spelat de senaste 30 dagarna'=0; 'Mindre än 50 kronor'=1; '50-99 kronor'=2; '100-199 kronor'=3; '200-299 kronor'=4; '300-399 kronor'=5; '400 kronor eller mer'=6; '<NA>'=NA", as.factor = F)# c("F17","F21","f22a","F40","FNY22020")df$F17 <-recode(df$F17,"'Nej'=0; 'Ja'=2; 'Vet inte'=1; '<NA>'=NA", as.factor = F)df$F21 <-recode(df$F21,"'Nej'=0; 'Ja'=2; 'Vet inte'=1; '<NA>'=NA", as.factor = F)df$F40 <-recode(df$F40,"'Nej'=0; 'Ja'=2; 'Vet inte'=1; '<NA>'=NA", as.factor = F)# f22 har kodats så att Nej = 0, Vet ej = 1, och sedan ökande nivå för varje person som kryssats för, d.v.s. max 5df$f22b <-recode(df$f22b,"'Chosen'=1; 'Not chosen'=0; '<NA>'=NA", as.factor = F)df$f22c <-recode(df$f22c,"'Chosen'=1; 'Not chosen'=0; '<NA>'=NA", as.factor = F)df$f22d <-recode(df$f22d,"'Chosen'=1; 'Not chosen'=0; '<NA>'=NA", as.factor = F)df$f22e <-recode(df$f22e,"'Chosen'=1; 'Not chosen'=0; '<NA>'=NA", as.factor = F)df <- df %>%mutate(f22 =case_when( f22a =="Chosen"~0, f22f =="Chosen"~1, (f22b+f22c+f22d+f22e) ==1~2, (f22b+f22c+f22d+f22e) ==2~3, (f22b+f22c+f22d+f22e) ==3~4, (f22b+f22c+f22d+f22e) ==4~5,TRUE~NA_real_ ))df$FNY22020 <-recode(df$FNY22020,"'Nej'=0; 'Ja'=2; 'Vet inte'=1; '<NA>'=NA", as.factor = F)# 37. Hur många gånger har du druckit så mycket alkohol att du känt dig berusad under den senaste 4-veckorsperioden?# df %>% count(as.numeric(df$f36)) visar en konstig fördelning, vi kodar om den enligt nedandf$f36r <-recode(as.numeric(as.character(df$f36)),"4:12=3;13:31=NA")# 50. Hur många gånger har du använt narkotika (cannabis eller annan narkotika) den senaste 4-veckors perioden?df$F49r <-recode(as.numeric(as.character(df$F49)),"4:12=3;13:100=NA")# 36. Hur många gånger har du druckit så mycket alkohol att du känt dig berusad?# 1) Ingen gång gå till fråga 39# Vi vill koda om F35, svar "Ingen gång" till att motsvara 0 för f36r# Samma gäller för F45 om narkotika inkl cannabis, med F49 om senaste 4v.df <- df %>%mutate(F35r =case_when(F35 =="Ingen gång"~0,TRUE~NA_real_ )) %>%mutate(F36new =coalesce(f36r,F35r)) %>%mutate(F45r =case_when(F45 =="Nej"~0,TRUE~NA_real_ )) %>%mutate(F49new =coalesce(F49r,F45r))# ta fram ett indexvärde för bruk under senaste 4vsenaste4v <-c("F14r","F18r","F36new","F49new","FNY12020r")df <- df %>%mutate(Senaste4v =rowSums(df %>%select(all_of(senaste4v)), na.rm = T))# Debutålder under 6 år förefaller orimlig eller åtminstone ovanlig, så den kodas om till missing/NA# for (i in itemsANDTSdebut){# df[[i]] <- recode(df[[i]],"0:5=NA", as.factor = F)# }df <- df %>%mutate(across(itemsANDTSdebut, as.character))df <- df %>%mutate(across(itemsANDTSdebut, as.numeric))``````{r}#| label: setup#| code-fold: false#| include: false# create dataframe with 2014 and 2020 data with all variables (post recode)df.omit.na <- df %>%#filter(ar %in% c(2014,2020)) %>% filter(ar =="2020") %>%select(itemlabels$itemnr,Kön,ARSKURS,SkolSDO)df.debutAge <- df %>%select(itemsANDTSdebut,Kön,ARSKURS,SkolSDO,ar)```## BakgrundVi har tagit data från 2020, eftersom två frågor tillkommit 2020.Frågorna har delats in i tre tänkta områden, som markerats medbakgrundsfärg i tabellen med items längre ner:- eget bruk- debutålder- föräldrarna/familjenFrågorna har stor variation i svarskategorierna, vilket beskrivs iPDF-filen med frågor, och även framgår om man klickar på </CODE> viddenna sidas rubrik högst upp och tittar på källkoden till analysen däromkodning ("recode") av svarskategorierna finns med tidigt i koden(innan denna text).Exempel på vanliga typer av svarskategorier och deras omkodning:- 'Nej, jag har aldrig rökt'=0;- 'Nej, bara provat hur det smakar'=1;- 'Nej, jag har rökt men slutat'=2;- 'Ja, ibland men inte varje dag'=3;- 'Ja, dagligen'=4;och:- 'Nej, ingen gång'=0;- 'Ja, 1 gång'=1;- 'Ja, 2-4 gånger'=2;- 'Ja, 5-10 gånger'=3;- 'Ja, 11-20 gånger'=4;- 'Ja, 21-50 gånger'=5;- 'Ja, mer än 50 gånger'=6;Denna typ av frekvensskattningar med så många svarsalternativ brukarsällan ge psykometriskt meningsfull information, d.v.s. det är intetillräckligt stor skillnad på de olika svarsalternativen för att var ochen av kategorierna ska bidra med mera information om respondenten. Vikommer med största sannolikhet behöva slå samman flera av dem för attkunna göra en rimlig analys.För denna analys är målsättningen inte att undersöka möjligheten att tafram ett eller flera indexvärden utifrån sammansättningar avitems/frågor som sedan kan användas på samtliga deltagare. Detta berorpå att de flesta deltagare har såpass liten användning av substansereller ens har svarat på frågorna. Däremot vill vi se hur frågornafungerar relativt varandra (item-hierarki) och om det skiljer sig mellankön, årskurs och över tid.```{r}itemlabels %>%kbl(booktabs = T, escape = F) %>%# bootstrap options are for HTML outputkable_styling(bootstrap_options =c("striped", "hover"), position ="left",full_width = F,font_size = r.fontsize,fixed_thead = T) %>%# when there is a long list in the table# column_spec(c(2:3), color = "red") %>% row_spec(1:9, bold = F, color ="black", background ="lightblue") %>%row_spec(10:14, bold = F, color ="white", background = RISEprimGreen) %>%row_spec(15:19, bold = F, color ="white", background = RISEcompPurple) %>%column_spec(1, bold = T) %>%kable_classic(html_font ="Lato")```## Bortfall i dataEftersom ANDTS-frågorna har större bortfall i svar kommer vi inte heltfiltrera bort respondenter med saknade svar.```{r}#| column: marginRIlistItemsMargin(df.omit.na, 11)``````{r}#---- Create a figure showing % of missing data for each item, based on the complete dataset----df.omit.na %>%select(itemlabels$itemnr) %>%t() %>%as.data.frame() %>%mutate(Missing =rowSums(is.na(.))) %>%select(Missing) %>%arrange(desc(Missing)) %>%rownames_to_column(var ="Item") %>%mutate(Percentage = Missing/nrow(df)*100) %>%mutate(Item =factor(Item, levels =rev(Item))) %>%ggplot(aes(x = Item, y = Percentage)) +geom_col() +coord_flip() +ggtitle("Missing data per item") +xlab("Items") +ylab("Percentage of responses missing")```Efter att ha tagit bort respondenter med färre än 12 items besvarade serbortfallet ut enligt nedan.```{r}#---- Filtering participants based on missing data----# If you want to include participants with missing data, input the minimum number of items responses that a participant should have to be included in the analysis:min.responses <-12# Select the variables we will work with, and filter out respondents with a lot of missing datadf.omit.na <- df.omit.na %>%filter(length(itemlabels$itemnr)-rowSums(is.na(.[itemlabels$itemnr])) >= min.responses)# create DIF variables for gender and gradedif.gender <- df.omit.na$Köndf.omit.na$Kön <-NULLdif.arskurs <- df.omit.na$ARSKURSdf.omit.na$ARSKURS <-NULLdif.stadsdel <- df.omit.na$SkolSDOdf.omit.na$SkolSDO <-NULLdf.omit.na %>%select(itemlabels$itemnr) %>%t() %>%as.data.frame() %>%mutate(Missing =rowSums(is.na(.))) %>%select(Missing) %>%arrange(desc(Missing)) %>%rownames_to_column(var ="Item") %>%mutate(Percentage = Missing/nrow(df)*100) %>%mutate(Item =factor(Item, levels =rev(Item))) %>%ggplot(aes(x = Item, y = Percentage)) +geom_col() +coord_flip() +ggtitle("Missing data per item") +xlab("Items") +ylab("Percentage of responses missing")n2020 <- df %>%filter(ar =="2020") %>%nrow()```Vi har `r nrow(df.omit.na)` respondenter i data, av totalt `r n2020`respondenter för år 2020. Det innebär att samplet vi analyserar bestårav den delen som använder olika typer av substanser. Vi kan senarejämföra dem med de som filtrerats ut.## Deskriptiva data### Demografi```{r}#| label: descriptives1#| layout-ncol: 3RIdemographics(dif.gender, "Kön")RIdemographics(dif.arskurs, "Årskurs")#RIdemographics(dif.stadsdel, "Stadsdel")```### Item-dataVi tar bort items om debutålder från tile-plotten, eftersom de skullegöra övriga frågor svårlästa.::: column-page-inset-left::: panel-tabset#### Tile plot```{r}#| label: descriptives2df.omit.na %>%select(!any_of(itemsANDTSdebut)) %>%RItileplot()```#### Barplots {.scrollable}```{r}#| label: alt-descriptives#| layout-ncol: 2RIbarplot(df.omit.na)```::::::Vi kan se att det är mycket få respondenter i en del kategorier, ochflera olika strukturer på svarsfördelningar.## Eget bruk```{r}df.eget <- df.omit.na %>%select(any_of(itemsANDTSegen))```### SvarskategorierEftersom frekvensbaserade svarskategorier använts, som ofta har mindrepsykometriskt meningsfulla skillnader mellan de högre kategorierna,behöver vi först titta på om de behöver slås samman.```{r}#| include: falsemirt.rasch <-mirt(df.eget, model=1, itemtype='Rasch') # unidimensional Rasch model``````{r}plot(mirt.rasch, type="trace")```Vi ser många problem här som behöver åtgärdas:- F14 - kategori 2 slås samman med kategori 3- FNY12020 - slår samman de tre högsta- F18 - slår samman 2+1 och 3+4- F34 - slår samman 1+2- F41 - tas bort - mycket få svar över 0- F47 - vi slår samman 3+4 och 5+6- F48 - dikotomiseras mellan 0 och övriga kategorier- F73 - vi slår samman mittenkategorierna 1-5, och låter 0 och 6 vara kvar.Det innebär att boffning/sniffning tas bort.### Omkodning av svarskategorier::: tab-panel#### Tileplot```{r}df.eget$F14 <-recode(df.eget$F14,"3=2;4=3")df.eget$FNY12020 <-recode(df.eget$FNY12020,"3:4=2")df.eget$F18 <-recode(df.eget$F18,"2=1;3:4=2")df.eget$F34 <-recode(df.eget$F34,"2=1;3=2;4=3;5=4")df.eget$F41 <-NULLdf.eget$F47 <-recode(df.eget$F47,"4=3;5:6=4")df.eget$F48 <-recode(df.eget$F48,"2=1;3:6=2")df.eget$F73 <-recode(df.eget$F73,"2:5=1;6=2")RItileplot(df.eget)```#### Analys av svarskategorier```{r}#| include: falsemirt.rasch <-mirt(df.eget, model=1, itemtype='Rasch') # unidimensional Rasch model``````{r}plot(mirt.rasch, type="trace")```:::F48 ser tveksam ut. Vi provar 1=0;2:3=1;4:6=2 i stället.```{r}df.eget$F48 <-recode(df.omit.na$F48,"1=0;2:3=1;4:6=2")df.erm <-PCM(df.eget)plotICC(df.erm, item.subset ="F48")```Ser bättre ut.```{r}#| column: marginRIlistItemsMargin(df.eget, fontsize =11)```::: column-page-inset-left::: panel-tabset### Item fit```{r}RIitemfitPCM2(df.eget, 500, 32, 8)```### PCA```{r}#| tbl-cap: "PCA of Rasch model residuals"RIpcmPCA(df.eget)```### Loadings 1st contrast```{r}RIloadLoc(na.omit(df.eget))```### Residualkorrelationer```{r}RIresidcorr(df.eget, cutoff =0.2)```### Targeting```{r}#| fig-height: 5RItargeting(df.eget)```### Itemhierarki```{r}#| fig-height: 5RIitemHierarchy(df.eget)```::::::Vi kan se att de två högsta svarskategorierna för F47 behöver slåssamman, de är oordnade. Det är också tydligt att F73 har hög item fitoch behöver tas bort.```{r}df.eget$F47 <-recode(df.eget$F47,"4=3")df.eget$F73 <-NULL```## Eget bruk 2```{r}#| column: marginRIlistItemsMargin(df.eget, fontsize =11)```::: column-page-inset-left::: panel-tabset### Item fit```{r}RIitemfitPCM2(df.eget, 500, 32, 8)```### PCA```{r}#| tbl-cap: "PCA of Rasch model residuals"RIpcmPCA(df.eget)```### Loadings 1st contrast```{r}RIloadLoc(na.omit(df.eget))```### Residualkorrelationer```{r}RIresidcorr(df.eget, cutoff =0.2)```### Targeting```{r}#| fig-height: 5RItargeting(df.eget)```### Itemhierarki```{r}#| fig-height: 5RIitemHierarchy(df.eget)```::::::### Summering av åtgärder för svarskategorier```{r}#| eval: false#| echo: true#| output: asisdf.eget$F14 <-recode(df.eget$F14,"3=2;4=3")df.eget$FNY12020 <-recode(df.eget$FNY12020,"3:4=2")df.eget$F18 <-recode(df.eget$F18,"2=1;3:4=2")df.eget$F34 <-recode(df.eget$F34,"2=1;3=2;4=3;5=4")df.eget$F41 <-NULLdf.eget$F47 <-recode(df.eget$F47,"4=3;5:6=4")df.eget$F47 <-recode(df.eget$F47,"4=3") # i praktiken 4:6=3 df.eget$F73 <-recode(df.eget$F73,"2:5=1;6=2")df.eget$F48 <-recode(df.omit.na$F48,"1=0;2:3=1;4:6=2")```## Invarians/DIF### Kön```{r}#| column: marginRIlistItemsMargin(df.eget, 13)```::: column-page-inset-left::: panel-tabset#### Tabell```{r}#| fig-height: 3RIdifTable(df.eget, dif.gender)```#### Figur item```{r}RIdifFigure(df.eget, dif.gender)```#### Figur svarströsklar```{r}RIdifFigThresh(df.eget, dif.gender)```::::::Det är röker och snusar som skiljer sig mellan könen. Figuren meditemtrösklar visar på mera detaljinformation.### Årskurs```{r}#| column: marginRIlistItemsMargin(df.eget, 13)```::: column-page-inset-left::: panel-tabset#### Tabell```{r}#| fig-height: 3RIdifTable(df.eget, dif.arskurs)```#### Figur item```{r}RIdifFigure(df.eget, dif.arskurs)```#### Figur svarströsklar```{r}RIdifFigThresh(df.eget, dif.arskurs)```::::::FNY12020 går över gränsvärdet, medan F47 är mycket nära. Det verkarhuvudsakligen vara den lägsta tröskeln som förändrats för F47.### ÅrtalHär exkluderas FNY122020 eftersom den bara finns för 2020.```{r}final.items <-names(df.eget)df.dif.years <- df %>%select(any_of(final.items),ar) %>%select(!FNY12020) %>%na.omit()dif.year <- df.dif.years$ardf.dif.years$ar <-NULLdf.dif.years$F14 <-recode(df.dif.years$F14,"3=2;4=3")df.dif.years$F18 <-recode(df.dif.years$F18,"2=1;3:4=2")df.dif.years$F34 <-recode(df.dif.years$F34,"2=1;3=2;4=3;5=4")df.dif.years$F41 <-NULLdf.dif.years$F47 <-recode(df.dif.years$F47,"4=3;5:6=4")df.dif.years$F47 <-recode(df.dif.years$F47,"4=3") # i praktiken 4:6=3 df.dif.years$F48 <-recode(df.dif.years$F48,"1=0;2:3=1;4:6=2")``````{r}#| column: marginRIlistItemsMargin(df.dif.years, 13)```::: column-page-inset-left::: panel-tabset#### Tabell```{r}#| fig-width: 10RIdifTable(df.dif.years, dif.year)```#### Figur item```{r}RIdifFigure(df.dif.years, dif.year)```#### Figur tid```{r}RIdifFigTime(df.dif.years, dif.year)```#### Figur svarströsklar```{r}RIdifFigThresh(df.dif.years, dif.year)```::::::Här sker en del intressanta förändringar över tid hos samtliga items.## DebutålderHär är det förmodligen mest intressant att ta fram medelvärde, median,och spridningsmått, samt visualiseringar.Det finns dock låga svar som är tvivelaktiga att ta med. När frågor omdebutålder besvaras med exempelvis intervallet 0-4 år förefaller detosannolikt att svaret är uppriktigt.```{r}df.debut <- df.omit.na %>%select(any_of(itemsANDTSdebut))```### Övergripande svarsfördelningTabellen nedan gäller samtliga fem items, enbart år 2020.```{r}df.debutAge %>%filter(ar ==2020) %>%select(all_of(itemsANDTSdebut)) %>%RIallresp()```Förslagsvis kodas alla svar under 9 års ålder som missing/NA innan andraberäkningar genomförs.### Omkodning av låga svar```{r}#| column: marginRIlistItemsMargin(df.debut, 13)``````{r}df.debdist <- df.debutAge %>%mutate(across(itemsANDTSdebut, ~recode(.x, "0:8=NA")))df.debdist %>%filter(ar ==2020) %>%select(all_of(itemsANDTSdebut)) %>%RItileplot()```### Visualisering av debutålder```{r}df.debdist %>%filter(ar ==2020) %>%select(all_of(itemsANDTSdebut)) %>%pivot_longer(everything()) %>%rename(Item = name, Ålder = value) %>%ggplot(aes(x = Ålder, group = Item, fill = Item)) +geom_histogram(bins =20,position ="stack",alpha =0.9) +scale_fill_viridis_d() +scale_x_continuous(breaks =c(9:21))```Ovan finns alla svar samlade från både Åk 9 och Gy 2, och båda köntillsammans.Nedan finns svaren uppdelade på årskurs.```{r}df.debdist %>%filter(ar ==2020) %>%filter(!ARSKURS =="<NA>") %>%select(any_of(c(itemsANDTSdebut,"ARSKURS","ar"))) %>%pivot_longer(itemsANDTSdebut) %>%rename(Item = name, Ålder = value, Årskurs = ARSKURS) %>%mutate(År =factor(ar)) %>%ggplot(aes(x = Ålder, group = Item, fill = Item)) +geom_histogram(bins =20,position ="stack",alpha =0.9) +scale_fill_viridis_d() +scale_x_continuous(breaks =c(9:21)) +facet_wrap(~Årskurs)``````{r}df.debdist %>%filter(ar ==2020) %>%filter(!ARSKURS =="<NA>") %>%filter(Kön %in%c("Pojke","Flicka")) %>%select(any_of(c(itemsANDTSdebut,"ARSKURS","ar","Kön"))) %>%pivot_longer(itemsANDTSdebut) %>%rename(Item = name, Ålder = value, Årskurs = ARSKURS) %>%mutate(År =factor(ar)) %>%ggplot(aes(x = Ålder, group = Item, fill = Item)) +geom_histogram(bins =20,position ="stack",alpha =0.9) +scale_fill_viridis_d() +scale_x_continuous(breaks =c(9:21)) +facet_grid(Kön~Årskurs)```Nedan enbart åk2.```{r}df.debdist %>%#filter(ar == 2020) %>%filter(ARSKURS =="Gy 2") %>%filter(Kön %in%c("Pojke","Flicka")) %>%select(any_of(c(itemsANDTSdebut,"ARSKURS","ar","Kön"))) %>%pivot_longer(itemsANDTSdebut) %>%rename(Item = name, Ålder = value, Årskurs = ARSKURS) %>%mutate(År =factor(ar)) %>%ggplot(aes(x = Ålder, group = Item, fill = Item)) +geom_histogram(bins =20,position ="stack",alpha =0.9) +scale_fill_viridis_d() +scale_x_continuous(breaks =c(9:21),guide =guide_axis(n.dodge =2)) +facet_grid(Kön~År)```### Debutålder över tid, Gy 2 enbartEftersom frågan ställs till både åk 9 och årskurs 2 på gymnasiet verkardet mest relevant att enbart redovisa rapporteringen som görs näreleverna är äldre.```{r}df.debdist %>%#filter(ar == 2020) %>%filter(ARSKURS %in%c("Gy 2")) %>%filter(Kön %in%c("Pojke","Flicka")) %>%select(any_of(c(itemsANDTSdebut,"ARSKURS","ar","Kön"))) %>%pivot_longer(itemsANDTSdebut) %>%rename(Item = name, Ålder = value, Årskurs = ARSKURS) %>%filter(!is.na(Ålder)) %>%mutate(År =factor(ar)) %>%#group_by(År,Årskurs) %>% count(Kön)group_by(År,Kön,Item) %>%summarise( Medelvärde =mean(Ålder),SD =sd(Ålder) ) %>%ggplot(aes(x = År, y = Medelvärde, group = Item, color = Item)) +geom_point(size =2) +geom_line() +#geom_ribbon(aes(ymin = Medelvärde - SD, ymax = Medelvärde + SD, fill = Item, color = NULL), alpha = 0.1) +#scale_color_viridis_d(begin = 0.1) +scale_x_discrete(breaks = årtal,guide =guide_axis(n.dodge =2)) +labs(title ="Genomsnittslig debutålder per substans över tid") +facet_grid(~Kön)```#### Komplement med båda åk```{r}df.debdist %>%#filter(ar == 2020) %>%filter(ARSKURS %in%c("Åk 9","Gy 2")) %>%filter(Kön %in%c("Pojke","Flicka")) %>%select(any_of(c(itemsANDTSdebut,"ARSKURS","ar","Kön"))) %>%pivot_longer(itemsANDTSdebut) %>%rename(Item = name, Ålder = value, Årskurs = ARSKURS) %>%filter(!is.na(Ålder)) %>%mutate(År =factor(ar)) %>%#group_by(År,Årskurs) %>% count(Kön)group_by(År,Kön,Årskurs,Item) %>%summarise( Medelvärde =mean(Ålder),SD =sd(Ålder) ) %>%ggplot(aes(x = År, y = Medelvärde, group = Item, color = Item)) +geom_point(size =2) +geom_line() +#geom_ribbon(aes(ymin = Medelvärde - SD, ymax = Medelvärde + SD, fill = Item, color = NULL), alpha = 0.1) +#scale_color_viridis_d(begin = 0.1) +scale_x_discrete(breaks = årtal,guide =guide_axis(n.dodge =2)) +labs(title ="Genomsnittslig debutålder per substans över tid") +facet_grid(Årskurs~Kön)```### Bortfall av svar```{r}#| column: marginRIlistItemsMargin(df.debut, 13)``````{r}#---- Create a figure showing % of missing data for each item, based on the complete dataset----df.debut %>%t() %>%as.data.frame() %>%mutate(Missing =rowSums(is.na(.))) %>%select(Missing) %>%arrange(desc(Missing)) %>%rownames_to_column(var ="Item") %>%mutate(Percentage = Missing/nrow(df)*100) %>%mutate(Item =factor(Item, levels =rev(Item))) %>%ggplot(aes(x = Item, y = Percentage)) +geom_col() +coord_flip() +ggtitle("Missing data per item") +xlab("Items") +ylab("Percentage of responses missing")```Enbart de som besvarat åtminstone tre av de fem frågorna kan vara med ianalysen.```{r}# If you want to include participants with missing data, input the minimum number of items responses that a participant should have to be included in the analysis:min.responses <-3# Select the variables we will work with, and filter out respondents with a lot of missing datadf.deb2 <- df.debdist %>%filter(length(itemsANDTSdebut)-rowSums(is.na(.[itemsANDTSdebut])) >= min.responses) %>%select(any_of(itemsANDTSdebut))```Detta reducerar sampelstorleken från `r nrow(df.omit.na)` till`r nrow(df.deb2)` respondenter.### Svarskategorier```{r}RIallresp(df.deb2)```Vi slår samman alla upp till 11 år i samma kategori, som betecknas medsiffran 0, därefter blir 12 år = kategori 1, 13 år = 2, och så vidareupp till 18-20 år = 7.```{r}df.deb2 <- df.deb2 %>%mutate(across(everything(), ~recode(.x, "1:11=0;12=1;13=2;13.5=2;14=3;15=4;16=5;16.5=6;17=6;18:20=7")))``````{r}RItileplot(df.deb2)``````{r}#| include: falsemirt.rasch <-mirt(df.deb2, model=1, itemtype='Rasch') # unidimensional Rasch model``````{r}plot(mirt.rasch, type="trace")```Enbart item F16 (rökning) uppvisar ordnade svarskategorier. Vi går ändåvidare och tittar på andra parametrar innan några eventuella åtgärdergörs.Det är dock svårt att få modellen att konvergera, vilket också bekräftaratt debutålder inte är meningsfullt att bygga något index av.## Explorativa indexberäkningar och visualiseringSmolkowski och kollegor [@smolkowski2006] skriver på sidan 241: "Wecreated an index of substance use by summing the number of reportedsubstances used in the last month: cigarettes, alcohol, marijuana, orany of the other drugs."Det ter sig lite märkligt att inte alls vikta substanserna, men vi kanprova ett liknande upplägg.Vi har fem items som kan användas, som avser tobaksrökning, snus,alkohol, narkotika (inkl cannabis), samt e-cigaretter. Dock har densistnämna enbart funnits sedan 2020, så den utelämnas tills vi harhittat ett sätt att se till att den inte förvränger jämförbarheten övertid. Det kan ev. vara lämpligt att på något vis integreratobaksanvändning, oavsett form.- Fråga 37 (f36 i data), *Hur många gånger har du druckit så mycket alkohol att du känt dig berusad under den senaste 4-veckorsperioden?* Fördelningen av svaren är märklig, se histogram nedan```{r}hist(as.numeric(df$f36), col = RISEprimGreen)```Vi kodar om enligt: "4:12=3;13:31=NA"```{r}hist(df$f36r, col = RISEprimGreen)```Samma sak gäller frågan om narkotika-användning.- 50. Hur många gånger har du använt narkotika (cannabis eller annan narkotika) den senaste 4-veckors perioden?```{r}hist(as.numeric(df$F49), col = RISEprimGreen)```Omkodning: "4:12=3;13:100=NA"```{r}hist(df$F49r, col = RISEprimGreen)```Item F14 är inte formulerad enligt samma tydliga frekvensfråga som detvå tidigare frågorna. Den har sedan tidigare kodats enligt nedan:recode(df\$F14,"'Nej, jag har aldrig rökt'=0; 'Nej, bara provat hur detsmakar'=1; 'Nej, jag har rökt men slutat'=2; 'Ja, ibland men inte varjedag'=3; 'Ja, dagligen'=4; '<NA>'=NA", as.factor = F)Och inför test av index kodas den "0:2=0;3=1;4=2"```{r}hist(df$F14r, col = RISEprimGreen)```Samma gäller FNY12020 (e-cigaretter)recode(df\$FNY12020,"'Nej, jag har aldrig rökt e-cigaretter'=0; 'Nej,bara provat hur det smakar'=1; 'Nej, jag har rökt e-cigaretter menslutat'=2; 'Ja, ibland men inte varje dag'=3; 'Ja, dagligen'=4;'<NA>'=NA", as.factor = F)Som blir "0:2=0;3=1;4=2"```{r}hist(df$FNY12020r, col = RISEprimGreen)```Och även F18 för snus.```{r}hist(df$F18r, col = RISEprimGreen)```### Separerade på respektive substans```{r}# for FNY12020r and F14r (e-cig and smoking)itemlabelsPlotFaktor <-cbind(senaste4v,c("Rökning","Snus","Alkohol","Narkotika (inkl. cannabis)","E-cigaretter")) %>%as.data.frame() %>%rename(itemnr = senaste4v,item = V2)andtsUseShare <-function(andts) { plotFaktor <- andts plotFaktorName <- itemlabelsPlotFaktor %>%filter(itemnr == plotFaktor) %>%pull(item) df %>%filter(Kön %in%c("Pojke", "Flicka"),!ARSKURS =="<NA>") %>%select(all_of(senaste4v), ar, Kön, ARSKURS) %>%mutate(bruk4v =case_when( .data[[plotFaktor]] ==0~"Ej använt", .data[[plotFaktor]] ==1~"Ibland men inte varje dag", .data[[plotFaktor]] ==2~"Dagligen",TRUE~"Svar saknas" ) ) %>%mutate(bruk4v =factor(bruk4v, levels =c("Dagligen","Ibland men inte varje dag","Ej använt","Svar saknas"))) %>%group_by(ar, Kön, ARSKURS) %>%count(bruk4v, .drop =FALSE) %>%mutate(Andel = (100* n /sum(n)) %>%round(digits =1)) %>%ggplot(aes(x = ar, y = Andel)) +geom_area(aes(fill = bruk4v),position ="stack",alpha =0.85 ) +scale_fill_manual(values =c("#D55E00", "#F0E442", "#009E73", "lightgrey")) +scale_y_continuous(breaks =c(0, 20, 40, 60, 80, 100)) +scale_x_continuous(breaks = årtal, guide =guide_axis(n.dodge =2)) +xlab("Årtal") +ylab("Andel i %") +theme(axis.text.x =element_text(size = ax.size, family ="sans"),axis.text.y =element_text(size = ax.size, family ="sans"),title =element_text(size = title.size),legend.text =element_text(size = legend.size),strip.text.x =element_text(size =14),panel.spacing =unit(0.5, "cm", data =NULL) ) +labs(title =paste0(plotFaktorName),subtitle ="Uppdelat på kön" ) +facet_grid(ARSKURS ~ Kön)}``````{r}andtsUseShare("F14r")andtsUseShare("F18r")``````{r}# for f36r and F49randtsUseShare2 <-function(andts) { plotFaktor <- andts plotFaktorName <- itemlabelsPlotFaktor %>%filter(itemnr == plotFaktor) %>%pull(item) df %>%filter(Kön %in%c("Pojke", "Flicka"),!ARSKURS =="<NA>") %>%select(all_of(senaste4v), ar, Kön, ARSKURS) %>%mutate(bruk4v =case_when( .data[[plotFaktor]] ==0~"Ej använt", .data[[plotFaktor]] ==1~"En gång", .data[[plotFaktor]] ==2~"Två gånger", .data[[plotFaktor]] ==3~"Tre gånger eller fler",TRUE~"Svar saknas" ) ) %>%mutate(bruk4v =factor(bruk4v, levels =c("Tre gånger eller fler","Två gånger","En gång","Ej använt","Svar saknas"))) %>%group_by(ar, Kön, ARSKURS) %>%count(bruk4v, .drop =FALSE) %>%mutate(Andel = (100* n /sum(n)) %>%round(digits =1)) %>%ggplot(aes(x = ar, y = Andel)) +geom_area(aes(fill = bruk4v),position ="stack",alpha =0.85 ) +scale_fill_manual(values =c("#D55E00", "orange", "#F0E442", "#009E73", "lightgrey")) +scale_y_continuous(breaks =c(0, 20, 40, 60, 80, 100)) +scale_x_continuous(breaks = årtal, guide =guide_axis(n.dodge =2)) +xlab("Årtal") +ylab("Andel i %") +theme(axis.text.x =element_text(size = ax.size, family ="sans"),axis.text.y =element_text(size = ax.size, family ="sans"),title =element_text(size = title.size),legend.text =element_text(size = legend.size),strip.text.x =element_text(size =14),panel.spacing =unit(0.5, "cm", data =NULL) ) +labs(title =paste0(plotFaktorName, ", användning senaste 4 veckorna"),subtitle ="Uppdelat på kön" ) +facet_grid(ARSKURS ~ Kön)}``````{r}andtsUseShare2("F36new")andtsUseShare2("F49new")```### Indexvärde för bruk under senaste 4vOm vi slår samman "F14r","F18r","F36new","F49new","FNY12020r" kan manmax ha 2+2+3+3+3 = 12```{r}hist(df$Senaste4v, col = RISEprimGreen)df %>%count(Senaste4v) %>%formattable()```Dock finns ingen viktning i ovanstående, så allt bruk likställs, utöveratt det går att rapportera högre nivå av alkohol och narkotika, där detär viktigt att notera att den sistnämna inkluderar cannabis.```{r}df %>%select(all_of(senaste4v)) %>%pivot_longer(everything()) %>%ggplot(aes(x = value, fill = name)) +geom_histogram()```F14r = rökning F18r = snus f36r = alkohol F49r = narkotika (cannabiseller annan narkotika) GNY12020r = e-cigaretterOvanstående är alla år sammanslaget. Nedan fördelat på årtal.```{r}df %>%select(all_of(senaste4v),ar) %>%pivot_longer(senaste4v) %>%ggplot(aes(x = value, fill = name)) +geom_histogram() +facet_wrap(~factor(ar))``````{r}df %>%select(all_of(senaste4v),ar) %>%pivot_longer(senaste4v) %>%ggplot(aes(x = value, fill = name)) +geom_histogram() +facet_grid(factor(ar) ~ name)```#### Test visualisering oviktat index "Bruk senaste 4v"Utifrån siffrorna i tabellen tidigare ter det sig rimligt att slå sammande som har värden på 6 eller mer. Vi ska också testa att gruppera de somhar x antal bruk.```{r}#| fig-height: 6plotFaktor ="Senaste4v"df %>%filter(Kön %in%c("Pojke", "Flicka"),!ARSKURS =="<NA>") %>%select(Senaste4v, ar, Kön, ARSKURS) %>%mutate(Senaste4v =recode(Senaste4v,"7:10=6")) %>%mutate(Senaste4v =factor(Senaste4v,levels =rev(c(0:6)) ) ) %>%#levels = c("Tre gånger eller fler","Två gånger","En gång","Ej använt","Svar saknas"))) %>% group_by(ar, Kön, ARSKURS) %>%count(Senaste4v, .drop =FALSE) %>%mutate(Andel = (100* n /sum(n)) %>%round(digits =1)) %>%ggplot(aes(x = ar, y = Andel)) +geom_area(aes(fill = Senaste4v),position ="stack",alpha =0.85 ) +#scale_fill_manual(values = c("#D55E00", "orange", "#F0E442", "#009E73", "lightgrey")) +scale_fill_viridis_d() +scale_y_continuous(breaks =c(0, 20, 40, 60, 80, 100)) +scale_x_continuous(breaks = årtal, guide =guide_axis(n.dodge =2)) +xlab("Årtal") +ylab("Andel i %") +theme(axis.text.x =element_text(size = ax.size, family ="sans"),axis.text.y =element_text(size = ax.size, family ="sans"),title =element_text(size = title.size),legend.text =element_text(size = legend.size),strip.text.x =element_text(size =14),panel.spacing =unit(0.5, "cm", data =NULL) ) +labs(title =paste0("Användning senaste 4 veckorna, oviktat index"),subtitle ="Uppdelat på kön" ) +facet_grid(ARSKURS ~ Kön)#c("6","5","4","3","2","1","0")```### BlandbrukE-cigaretter ej med pga enbart data från 2020. Snusning finns ej med,kan läggas till om så önskas.```{r}#| fig-height: 6plotFaktor ="Senaste4v"df %>%filter(Kön %in%c("Pojke", "Flicka"),!ARSKURS =="<NA>") %>%select(all_of(senaste4v), Senaste4v, ar, Kön, ARSKURS) %>%mutate(bruk4v =case_when( Senaste4v ==0~"Ej använt", F14r ==1| F36new ==1| F49new ==1~"En substans en gång", F14r >=1& F36new >=1~"Rökning och alkohol en gång eller oftare", F14r >=1& F49new >=1~"Rökning och narkotika en gång eller oftare", F36new >=1& F49new >=1~"Alkohol och narkotika en gång eller oftare", F14r >=1& F36new >=1& F49new >=1~"Alla tre substanser en gång eller oftare",TRUE~"Svar saknas" ) ) %>%mutate(bruk4v =recode(bruk4v,"NA='Svar saknas'")) %>%mutate(bruk4v =factor(bruk4v, levels =c("Alla tre substanser en gång eller oftare","Alkohol och narkotika en gång eller oftare","Rökning och narkotika en gång eller oftare","Rökning och alkohol en gång eller oftare","En substans en gång","Ej använt","Svar saknas") )) %>%select(bruk4v,ar,Kön,ARSKURS) %>%group_by(ar, Kön, ARSKURS) %>%count(bruk4v, .drop =FALSE) %>%mutate(Andel = (100* n /sum(n)) %>%round(digits =1)) %>%ggplot(aes(x = ar, y = Andel)) +geom_area(aes(fill = bruk4v),position ="stack",alpha =0.85 ) +scale_fill_viridis_d(labels =function(x) str_wrap(x, width =14)) +scale_y_continuous(breaks =c(0, 20, 40, 60, 80, 100)) +scale_x_continuous(breaks = årtal, guide =guide_axis(n.dodge =2)) +xlab("Årtal") +ylab("Andel i %") +theme(axis.text.x =element_text(size = ax.size, family ="sans"),axis.text.y =element_text(size = ax.size, family ="sans"),title =element_text(size = title.size),legend.text =element_text(size = legend.size),strip.text =element_text(size =12),panel.spacing =unit(0.5, "cm", data =NULL) ) +labs(title =paste0("Blandbruk, användning senaste 4 veckorna"),subtitle ="Uppdelat på kön" ) +facet_grid(ARSKURS ~ Kön)```### Utan icke-brukare/saknade svar```{r}#| fig-height: 6df %>%filter(Kön %in%c("Pojke", "Flicka"),!ARSKURS =="<NA>") %>%select(all_of(senaste4v), Senaste4v, ar, Kön, ARSKURS) %>%mutate(bruk4v =case_when( Senaste4v ==0~"Ej använt", F14r ==1~"Enbart rökning", F36new ==1~"Enbart alkohol", F49new ==1~"Enbart narkotika", F14r >=1& F36new >=1~"Rökning och alkohol en gång eller oftare", F14r >=1& F49new >=1~"Rökning och narkotika en gång eller oftare", F36new >=1& F49new >=1~"Alkohol och narkotika en gång eller oftare", F14r >=1& F36new >=1& F49new >=1~"Alla tre substanser en gång eller oftare",TRUE~"Svar saknas" ) ) %>%mutate(bruk4v =recode(bruk4v,"'Svar saknas'=NA;'Ej använt'=NA")) %>%mutate(bruk4v =factor(bruk4v, levels =c("Alla tre substanser en gång eller oftare","Alkohol och narkotika en gång eller oftare","Rökning och narkotika en gång eller oftare","Rökning och alkohol en gång eller oftare","Enbart narkotika","Enbart alkohol","Enbart rökning") )) %>%filter(!is.na(bruk4v)) %>%select(bruk4v,ar,Kön,ARSKURS) %>%group_by(ar, Kön, ARSKURS) %>%count(bruk4v, .drop =FALSE) %>%mutate(Andel = (100* n /sum(n)) %>%round(digits =1)) %>%ggplot(aes(x = ar, y = Andel)) +geom_area(aes(fill = bruk4v),position ="stack",alpha =0.85 ) +#scale_fill_manual(values = c("#D55E00", "orange", "#F0E442", "#009E73", "lightgrey")) +scale_fill_viridis_d(labels =function(x) str_wrap(x, width =14)) +scale_y_continuous(breaks =c(0, 20, 40, 60, 80, 100)) +scale_x_continuous(breaks = årtal, guide =guide_axis(n.dodge =2)) +xlab("Årtal") +ylab("Andel i %") +theme(axis.text.x =element_text(size = ax.size, family ="sans"),axis.text.y =element_text(size = ax.size, family ="sans"),title =element_text(size = title.size),legend.text =element_text(size = legend.size),strip.text =element_text(size =12),panel.spacing =unit(0.5, "cm", data =NULL) ) +labs(title =paste0("Blandbruk, användning senaste 4 veckorna"),subtitle ="Uppdelat på kön" ) +facet_grid(ARSKURS ~ Kön)```### Tabell```{r}library(gt)library(gtExtras)andtsTable <-function(year) {df %>%filter(Kön %in%c("Pojke", "Flicka"),!ARSKURS =="<NA>") %>%filter(ar == year) %>%select(all_of(senaste4v), Senaste4v, ar, Kön, ARSKURS) %>%# mutate(# bruk4v = case_when(# Senaste4v == 0 ~ "Ej använt",# F14r == 1 | F36new == 1 | F49new == 1 ~ "En substans en gång",# F14r > 1 & F36new > 1 ~ "Rökning och alkohol mer än en gång",# F14r > 1 & F49new > 1 ~ "Rökning och narkotika mer än en gång",# F36new > 1 & F49new > 1 ~ "Alkohol och narkotika mer än en gång",# F14r > 1 & F36new > 1 & F49new > 1 ~ "Alla tre substanser mer än en gång",# TRUE ~ "Svar saknas"# )# ) %>% # mutate(bruk4v = recode(bruk4v,"NA='Svar saknas'")) %>% # mutate(bruk4v = factor(bruk4v, levels = c("Alla tre substanser mer än en gång",# "Alkohol och narkotika mer än en gång",# "Rökning och narkotika mer än en gång",# "Rökning och alkohol mer än en gång",# "En substans en gång",# "Ej använt",# "Svar saknas")# )) %>% mutate(bruk4v =case_when( Senaste4v ==0~"Ej använt", F14r ==1~"Enbart rökning", F36new ==1~"Enbart alkohol", F49new ==1~"Enbart narkotika", F14r >=1& F36new >=1~"Rökning och alkohol en gång eller oftare", F14r >=1& F49new >=1~"Rökning och narkotika en gång eller oftare", F36new >=1& F49new >=1~"Alkohol och narkotika en gång eller oftare", F14r >=1& F36new >=1& F49new >=1~"Alla tre substanser en gång eller oftare",TRUE~"Svar saknas" ) ) %>%mutate(bruk4v =recode(bruk4v,"'Svar saknas'=NA;'Ej använt'=NA")) %>%mutate(bruk4v =factor(bruk4v, levels =c("Alla tre substanser en gång eller oftare","Alkohol och narkotika en gång eller oftare","Rökning och narkotika en gång eller oftare","Rökning och alkohol en gång eller oftare","Enbart narkotika","Enbart alkohol","Enbart rökning") )) %>%select(bruk4v,ar,Kön,ARSKURS) %>%group_by(ar, ARSKURS, Kön) %>%count(bruk4v, .drop =FALSE) %>%mutate(Andel = (100* n /sum(n)) %>%round(digits =1)) %>%rename(År = ar, Årskurs = ARSKURS,Bruk = bruk4v) %>%gt(.,groupname_col =c("Årskurs","Kön"),rowname_col ="År") %>%gt_theme_espn() %>%tab_options(table.font.name ="Lato",container.width =500,heading.align ="left") %>%cols_align(align ="right")}```::: panel-tabset#### 2006```{r}andtsTable(2006)```#### 2010```{r}andtsTable(2010)```#### 2014```{r}andtsTable(2014)```#### 2018```{r}andtsTable(2018)```#### 2020```{r}andtsTable(2020)```:::### Missing data över tid```{r}df %>%select(all_of(senaste4v),ar) %>%pivot_longer(senaste4v) %>%filter(is.na(value),!name =="FNY12020r") %>%group_by(ar,name) %>%summarise(n =n()) %>%#mutate(Value = recode(value,"NA=1")) %>% ggplot(aes(x =factor(ar), y = n, color = name, group = name)) +geom_point(size =2) +geom_line()```## Föräldrafrågor```{r}itemsANDTSfldr <-c("F17","F21","f22","F40","FNY22020")df.fldr <- df %>%select(all_of(itemsANDTSfldr)) %>%na.omit()```Fråga f22 är summerad utifrån antalet familjemedlemmar som röker eller snusar, och har därför fler möjliga svarsalternativ.Övriga frågor har tre möjliga svar, utifrån frågan om huruvida eleven "får" använda en substans för föräldrarna:- 'Nej'=0;- 'Vet inte'=1;- 'Ja'=2;```{r}#| column: marginRIlistItemsMargin(df.fldr, 13)```### Deskriptiv statistik```{r}RItileplot(df.fldr)``````{r}#| column: marginRIlistItemsMargin(df.fldr, fontsize =11)```::: column-page-inset-left::: panel-tabset### Item fit```{r}RIitemfitPCM2(df.fldr, 400, 16, 8)```### PCA```{r}#| tbl-cap: "PCA of Rasch model residuals"RIpcmPCA(df.fldr)```### Loadings 1st contrast```{r}RIloadLoc(na.omit(df.fldr))```### Residualkorrelationer```{r}RIresidcorr(df.fldr, cutoff =0.2)```### Targeting```{r}#| fig-height: 5RItargeting(df.fldr)```### Itemhierarki```{r}#| fig-height: 5RIitemHierarchy(df.fldr)```::::::Som väntat passar inte f22 in bland övriga frågor, vilket syns tydligt på figuren med faktorladdning på första residualkontrasten.Gällande residualkorrelationer finns ett mycket starkt samband mellan röka och snusa. Det finns även ett samband mellan snusa och alkohol som är något över gränsvärdet.Vi tar bort f22 och tittar på svarskategorier för övriga frågor```{r}df.fldr$f22 <-NULL```### Svarskategorier```{r}#| include: falsemirt.rasch <-mirt(df.fldr, model=1, itemtype='Rasch') # unidimensional Rasch model``````{r}plot(mirt.rasch, type="trace")```Att koda "Vet ej" som mitten på svarsskalan var ett test, och det verkar ha fungerat acceptabelt förutom för F40. Vi kodar om "Vet ej" som missing/NA.```{r}df.fldr$F40 <-recode(df.fldr$F40,"1=NA;2=1")df.erm <-PCM(df.fldr)plotICC(df.erm, item.subset ="F40")``````{r}RItargeting(df.fldr)``````{r}RIitemparams(df.fldr,"ANDTSfldr.csv")```Det är inte möjligt att ta fram något indexvärde, men det bör vara möjligt att ta fram en variabel som säger något om föräldrarnas tillåtande attityd, vilket är en känd riskfaktor för bruk av ANDTS.En utgångspunkt kan vara ett gränsvärdet på person location -1.5, utifrån item-parametrarna i tabellen ovan.```{r}df.fldr$FLDRscore <-RIestThetas2(df.fldr, cpu =8)hist(df.fldr$FLDRscore, col = RISEprimGreen)ggplot(df.fldr,(aes(x = FLDRscore))) +geom_histogram(fill = RISEprimGreen, bins =40)df.fldr %>%mutate(Score =case_when(FLDRscore <-1.5~"Låg risk",TRUE~"Förhöjd risk") )%>%count(Score)```Eller så kan vi skilja ut de som svarat "Vet ej" eller "Ja" på någon av frågorna som "Förhöjd risk".```{r}df.fldr %>%mutate(Fldr =rowSums(across(any_of(itemsANDTSfldr)))) %>%mutate(Score =case_when(Fldr >0~"Förhöjd risk",TRUE~"Låg risk") )%>%count(Score)```Alternativt att skilja ut de som svarat "Ja" på någon av dessa fyra frågor, jämfört med övriga.```{r}df.fldr %>%mutate(Score =case_when(F17 ==2| F21 ==2| F40 ==1| FNY22020 ==2~"Förhöjd risk",TRUE~"Låg risk") )%>%count(Score)```Båda dessa varianter kan testas i sambandsanalyser med andra variabler för att identifiera vilken som förefaller mest korrekt att använda.## Programvara som använts```{r}#| label: packagesvpkgs <-cite_packages(cite.tidyverse =TRUE, output ="table",bib.file ="grateful-refs.bib",include.RStudio =TRUE)formattable(pkgs, table.attr ='class=\"table table-striped\" style="font-size: 14px; font-family: Lato; width: 80%"')```## Referenser