Как вы запускаете chisq.test на двух разных выходных данных dplyr, а затем суммируете его в таблице?
Вопрос, который у меня есть, связан с тем, который я недавно опубликовал здесь
Jaap был фантастическим, потому что он помог мне создать этот замечательный вывод сводных таблиц подсчетов и частот (в процентах) категориальных переменных.
"Реальные данные", которые я анализирую, поступают из двух разных больниц, в каждой из которых разная частота употребления наркотиков, но не всегда одни и те же лекарства.
Резюме от Яапса func
Функция отсюда выглядит следующим образом, а вся data.frame
приводится ниже (больницы номер один и два):
id AB1 AB2 AB3 AB4 AB5 AB6 AB7 AB8 AB9 AB10 AB11 AB12 AB13 total perc
1 1st gen Cephalosporin 4 0 0 1 1 0 0 0 0 0 0 0 0 6 1.9
2 3rd gen Cephalosporin 44 7 8 1 3 2 0 0 0 0 0 0 0 65 20.5
3 4th gen Cephalosporin 3 3 0 1 2 1 0 0 0 0 0 0 0 10 3.2
Теперь я хотел бы запустить chisq.test
(или же Fisher's
если частота ниже 5) всех переменных (имен), найденных в id
столбец с использованием общей частоты, найденной в total
колонка, сравнивая больницу один против больницы два.
Итак, с точки зрения непрофессионала, я хочу ответить на следующий вопрос: "Цефалоспорины 1-го поколения давали чаще в больнице 1 по сравнению с больницей 2?" и т.п.
Поскольку некоторые переменные идентификаторы могут не совпадать в разных больницах, я ожидаю, что это может вернуть NULL
расчет.
В идеале я бы хотел обобщить все эти выводы в таблице с соответствующим значением p, чтобы оно выглядело следующим образом:
id Hospital One Total Frequency Hospital Two Total Frequency p-value
xyz 15 30 0.01
Большое спасибо за Вашу помощь.
Все данные можно найти ниже.
ура
РЕДАКТИРОВАТЬ после поднятых вопросов Хашаа:
Это просто фиктивный вывод (в идеале, что я хотел бы иметь).
id Hospital One Total Frequency Hospital Two Total Frequency p-value
xyz n i x.xx
Как уже упоминалось, значение p должно быть получено из chisq.test
или же fisher.test
,
Я полагаю, что выходные данные должны быть сгенерированы таким образом, с больницей № 1 hosp1
и больница № 2 называется hosp2
# first take those columns of the dplyr output your interested in
hosp1_sel<-hosp1[,c("id","total")]
hosp2_sel<-hosp2[,c("id","total")]
#then merge the data.frames to one so you can perform analysis on one dataframe
new_df <- merge(hosp1_sel, hosp2_sel, by=0)
#this looks like this
> new_df
Row.names id.x total.x id.y total.y
1 1 1st gen Cephalosporin 6 3rd gen Cephalosporin 19
2 10 Trimethoprim 2 Polypeptide 1
3 11 Ureidopenicillin 46 Rifamycin 1
4 12 Carbapenem 19 Tetracycline 1
5 13 Fluorquinolone 17 Lincosamide 1
6 14 Nitromidazole 12 Quinolone 2
7 15 Antifungal 6 Sulfonamides 2
8 16 Oxazolidinone 2 Nitroimidazole 1
9 17 Rifamycin 1 Polymyxine 1
10 18 Polypeptide 1 Colistin 1
11 2 3rd gen Cephalosporin 65 Carbapenem 37
12 3 4th gen Cephalosporin 10 Fluoroquinolone 24
13 4 Aminoglycoside 31 Glycopeptide 32
14 5 Clindamycin 2 Penicillin 29
15 6 Glycopeptide 55 Ureidopenicillin 36
16 7 Macrolide 3 Lipopeptide 4
17 8 Penicillin 36 Macrolid 2
18 9 Tetracycline 2 Aminoglycoside 9
Вот где я застреваю. На мой взгляд, теперь я должен сделать это data.frame
шире, чтобы потом иметь возможность запускать что-то вроде:
chisq.test(hosp1$Ureidopenicillin, hosp2$Ureidopenicillin)
Чтобы определить, чаще ли вводили "Уреидопенициллины" в больнице № 1 по сравнению с больницей № 2 и так далее.
Проблема в том, что это фактически сравнивает "подсчеты", а не "пропорции" из таблицы непредвиденных обстоятельств, хотя...
Есть идеи?
О.
Больница № 1 data.frame
:
structure(list(id = structure(1:19, .Label = c("1st gen Cephalosporin",
"3rd gen Cephalosporin", "4th gen Cephalosporin", "Aminoglycoside",
"Clindamycin", "Glycopeptide", "Macrolide", "Penicillin", "Tetracycline",
"Trimethoprim", "Ureidopenicillin", "Carbapenem", "Fluorquinolone",
"Nitromidazole", "Antifungal", "Oxazolidinone", "Rifamycin",
"Polypeptide", "Lipopeptide "), class = "factor"), AB1 = c(4L,
44L, 3L, 1L, 1L, 7L, 1L, 7L, 2L, 1L, 12L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L), AB2 = c(0L, 7L, 3L, 7L, 0L, 16L, 2L, 9L, 0L, 0L,
9L, 1L, 2L, 6L, 0L, 0L, 0L, 0L, 0L), AB3 = c(0L, 8L, 0L, 5L,
1L, 13L, 0L, 5L, 0L, 0L, 12L, 4L, 1L, 2L, 0L, 0L, 0L, 0L, 0L),
AB4 = c(1L, 1L, 1L, 6L, 0L, 5L, 0L, 8L, 0L, 0L, 5L, 3L, 4L,
1L, 1L, 1L, 1L, 0L, 0L), AB5 = c(1L, 3L, 2L, 2L, 0L, 4L,
0L, 1L, 0L, 0L, 2L, 4L, 1L, 1L, 2L, 0L, 0L, 0L, 0L), AB6 = c(0L,
2L, 1L, 3L, 0L, 5L, 0L, 1L, 0L, 0L, 2L, 1L, 1L, 2L, 1L, 0L,
0L, 0L, 0L), AB7 = c(0L, 0L, 0L, 1L, 0L, 0L, 0L, 3L, 0L,
0L, 2L, 2L, 2L, 0L, 0L, 1L, 0L, 1L, 0L), AB8 = c(0L, 0L,
0L, 3L, 0L, 1L, 0L, 0L, 0L, 0L, 2L, 1L, 1L, 0L, 0L, 0L, 0L,
0L, 1L), AB9 = c(0L, 0L, 0L, 1L, 0L, 1L, 0L, 1L, 0L, 0L,
0L, 2L, 2L, 0L, 0L, 0L, 0L, 0L, 0L), AB10 = c(0L, 0L, 0L,
1L, 0L, 2L, 0L, 0L, 0L, 1L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L,
0L), AB11 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 2L, 0L, 1L, 0L, 0L, 0L, 0L), AB12 = c(0L, 0L, 0L, 0L,
0L, 1L, 0L, 1L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L
), AB13 = c(0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 1L, 0L, 0L, 0L, 0L), total = c(6, 65, 10, 31, 2,
55, 3, 36, 2, 2, 46, 19, 17, 12, 6, 2, 1, 1, 1), perc = c(1.9,
20.5, 3.2, 9.8, 0.6, 17.4, 0.9, 11.4, 0.6, 0.6, 14.5, 6,
5.4, 3.8, 1.9, 0.6, 0.3, 0.3, 0.3)), class = "data.frame", .Names = c("id",
"AB1", "AB2", "AB3", "AB4", "AB5", "AB6", "AB7", "AB8", "AB9",
"AB10", "AB11", "AB12", "AB13", "total", "perc"), row.names = c(NA,
-19L))
Больница № 2 data.frame
:
structure(list(id = structure(1:18, .Label = c("3rd gen Cephalosporin",
"Carbapenem", "Fluoroquinolone", "Glycopeptide", "Penicillin",
"Ureidopenicillin", "Lipopeptide", "Macrolid", "Aminoglycoside",
"Polypeptide", "Rifamycin", "Tetracycline", "Lincosamide", "Quinolone",
"Sulfonamides", "Nitroimidazole", "Polymyxine", "Colistin"), class = "factor"),
AB1 = c(9L, 3L, 1L, 7L, 16L, 22L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L), AB2 = c(2L, 17L, 5L, 8L, 2L, 9L,
1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), AB3 = c(1L,
9L, 4L, 5L, 3L, 1L, 1L, 1L, 3L, 1L, 1L, 1L, 0L, 0L, 0L, 0L,
0L, 0L), AB4 = c(1L, 3L, 3L, 7L, 4L, 3L, 0L, 0L, 2L, 0L,
0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L), AB5 = c(3L, 1L, 4L, 1L,
4L, 1L, 2L, 0L, 1L, 0L, 0L, 0L, 0L, 1L, 2L, 0L, 0L, 0L),
AB6 = c(3L, 2L, 4L, 1L, 0L, 0L, 0L, 0L, 3L, 0L, 0L, 0L, 0L,
0L, 0L, 1L, 1L, 0L), AB7 = c(0L, 2L, 3L, 3L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L), total = c(19,
37, 24, 32, 29, 36, 4, 2, 9, 1, 1, 1, 1, 2, 2, 1, 1, 1),
perc = c(9.4, 18.2, 11.8, 15.8, 14.3, 17.7, 2, 1, 4.4, 0.5,
0.5, 0.5, 0.5, 1, 1, 0.5, 0.5, 0.5)), class = "data.frame", .Names = c("id",
"AB1", "AB2", "AB3", "AB4", "AB5", "AB6", "AB7", "total", "perc"
), row.names = c(NA, -18L))
1 ответ
Слияние по hospital <- left_join(hosp1, hosp2, by = "id") %>% select(id, total.x, total.y)
привело к
#id total.x total.y
#1 1st gen Cephalosporin 6 NA
#2 3rd gen Cephalosporin 65 19
#3 4th gen Cephalosporin 10 NA
#4 Aminoglycoside 31 9
#5 Clindamycin 2 NA
#6 Glycopeptide 55 32
#7 Macrolide 3 NA
#8 Penicillin 36 29
#9 Tetracycline 2 1
#10 Trimethoprim 2 NA
#11 Ureidopenicillin 46 36
#12 Carbapenem 19 37
#13 Fluorquinolone 17 NA
#14 Nitromidazole 12 NA
#15 Antifungal 6 NA
#16 Oxazolidinone 2 NA
#17 Rifamycin 1 1
#18 Polypeptide 1 1
#19 Lipopeptide 1 NA
Странно что слишком много NA
S производится для hosp2
, При ближайшем рассмотрении, есть несоответствия между id
переменные. Например, 14-й ряд в hosp1
является Nitromidazole
тогда как 16-й ряд hosp2
является Nitroimidazole
и я не уверен, что они указывают на одно и то же лекарство.
Во всяком случае, хотя у меня есть некоторые сомнения по поводу вашего использования chisq.test
желаемый результат может быть получен следующим образом
pval <- function(x, y){
ifelse(!is.na(x) & !is.na(y), chisq.test(c(x, y))$p.value, NA)
}
p <- lapply(1:length(hospital$total.x),
function(i){
pval(hospital$total.x[i],hospital$total.y[i])
}
)
hospital$p_value <- unlist(p)
colnames(hospital) <- c("id", "Hospital One Total Frequency", "Hospital Two Total Frequency", "p-value")
Окончательный вывод выглядит
> hospital
# id Hospital One Total Frequency Hospital Two Total Frequency p-value
#1 1st gen Cephalosporin 6 NA NA
#2 3rd gen Cephalosporin 65 19 5.193805e-07
#3 4th gen Cephalosporin 10 NA NA
#4 Aminoglycoside 31 9 5.042182e-04
#5 Clindamycin 2 NA NA
#6 Glycopeptide 55 32 1.366852e-02
#7 Macrolide 3 NA NA
#8 Penicillin 36 29 3.852612e-01
#9 Tetracycline 2 1 5.637029e-01
#10 Trimethoprim 2 NA NA
#11 Ureidopenicillin 46 36 2.694564e-01
#12 Carbapenem 19 37 1.615693e-02
#13 Fluorquinolone 17 NA NA
#14 Nitromidazole 12 NA NA
#15 Antifungal 6 NA NA
#16 Oxazolidinone 2 NA NA
#17 Rifamycin 1 1 1.000000e+00
#18 Polypeptide 1 1 1.000000e+00
#19 Lipopeptide 1 NA NA