Hi,

I am trying to extract sensitivity, specificity, TP, TN, PPV, NPV. I have a database of around 500 patients and I am looking at a test and how well it can predict the outcome in each age group (I have created 4 age groups).

I used the below but unfortunately I can't get the results for each age group. I have put group_by (age_group).

This is the code:

library(finalfit)

library(yardstick)

library(tidyverse)

prognos <- function(.data, estimate, truth){

.estimate = sym(estimate)

.truth = sym(truth)

.data %>%

drop_na(!! .estimate, !! .truth) %>%

summarise(

N = n(),

TP = sum(!! .truth == 1 & !! .estimate == 1),

TN = sum(!! .truth == 0 & !! .estimate == 0),

FP = sum(!! .truth == 0 & !! .estimate == 1),

FN = sum(!! .truth == 1 & !! .estimate == 0),

Sens = sens(., !! .truth, !! .estimate).estimate,
Spec = spec(., !! .truth, !! .estimate).estimate,

PPV = ppv(., !! .truth, !! .estimate).estimate,
NPV = npv(., !! .truth, !! .estimate).estimate,

above = paste0(TP + FP, " (", ((100*(TP + FP))/N) %>% round_tidy(1), ")"),

below = paste0(TN + FN, " (", ((100*(TN + FN))/N) %>% round_tidy(1), ")")

) %>%

mutate_at(vars("Sens", "PPV", "NPV"), ~ prod(., 100)) %>%

mutate(across(c(everything(), -above, -below), round, digits = 1))

}

NAFLD_new %>%

prognos(estimate = "estimate", truth = "cirrhosis")

This is the result:

prognos(estimate = "estimate", truth = "cirrhosis")

`summarise()`

has grouped output by 'age_group'. You can override using the `.groups`

argument.

# A tibble: 16 × 12

# Groups: age_group [4]

age_group N TP TN FP FN Sens Spec PPV NPV above below

1 40-49 61 11 31 4 15 26.1 12.6 30.8 15.2 15 (24.6) 46 (75.4)

2 40-49 61 11 31 4 15 26.1 12.6 30.8 15.2 15 (24.6) 46 (75.4)

3 40-49 61 11 31 4 15 26.1 12.6 30.8 15.2 15 (24.6) 46 (75.4)

4 40-49 61 11 31 4 15 26.1 12.6 30.8 15.2 15 (24.6) 46 (75.4)

5 50-59 111 33 36 27 15 26.1 12.6 30.8 15.2 60 (54.1) 51 (45.9)

6 50-59 111 33 36 27 15 26.1 12.6 30.8 15.2 60 (54.1) 51 (45.9)

7 50-59 111 33 36 27 15 26.1 12.6 30.8 15.2 60 (54.1) 51 (45.9)

8 50-59 111 33 36 27 15 26.1 12.6 30.8 15.2 60 (54.1) 51 (45.9)

9 <40 52 6 39 3 4 26.1 12.6 30.8 15.2 9 (17.3) 43 (82.7)

10 <40 52 6 39 3 4 26.1 12.6 30.8 15.2 9 (17.3) 43 (82.7)

11 <40 52 6 39 3 4 26.1 12.6 30.8 15.2 9 (17.3) 43 (82.7)

12 <40 52 6 39 3 4 26.1 12.6 30.8 15.2 9 (17.3) 43 (82.7)

13 >60 81 26 25 20 10 26.1 12.6 30.8 15.2 46 (56.8) 35 (43.2)

14 >60 81 26 25 20 10 26.1 12.6 30.8 15.2 46 (56.8) 35 (43.2)

15 >60 81 26 25 20 10 26.1 12.6 30.8 15.2 46 (56.8) 35 (43.2)

16 >60 81 26 25 20 10 26.1 12.6 30.8 15.2 46 (56.8) 35 (43.2)

Warning message:

Returning more (or less) than 1 row per `summarise()`

group was deprecated in dplyr 1.1.0.

Please use `reframe()`

instead.

When switching from `summarise()`

to `reframe()`

, remember that `reframe()`

always returns an ungrouped data frame and adjust

accordingly.

I am not sure why it gives me each age group 4 times and why sens/spec is the same everywhere.

Does anyone can suggest a solution this problem please?

Thanks you.