#r #match #reshape #chi-squared
#r #совпадение #изменить форму #хи-квадрат
Вопрос:
Я хочу
- измените форму моих сопоставленных данных (MR против MS), чтобы они были такими, как показано на прилагаемом скриншоте; в основном с теми же заголовками столбцов, но с добавлением «.1», который относится ко 2-му набору (MS). Это результат сопоставления 2 когорт после того, как я отсортировал их, чтобы получить совпадающие пары (в столбце с именем
subclass
), чтобы после этого я мог выполнить тест McNemar. - напишите функцию для выполнения теста McNemar для последовательных похожих групп, например
Gender
, vsGender.1
,Smoking_2gps
vsSmoking_2gps.1
,Diabetes1.0
vsDiabetes1.0.1
. и т. Д. В группе MR по сравнению с группой MS
Набор данных здесь (показан лист 1 для вертикального формата и лист 2 для горизонтального необходимого формата).
Я думаю о изменении формы на основе подкласса по отношению к 2 сопоставленным когортам MS против MR в Status.of.Mitral.Valve
переменной
В качестве поправки
Когда я попытался использовать mcnemar
, я получил list()
. Вот str(df
** Примечание: * wide
набор данных — это тот, который имеет горизонтальный формат, который нам нужно сделать mcnemar
на его основе.
> str(df)
'data.frame': 124 obs. of 17 variables:
$ Serial.ID : int 39 862 458 581 869 774 888 83 433 655 ...
$ Status.of.Mitral.Valve : chr "MR" "MR" "MR" "MR" ...
$ Age : int 65 60 56 33 50 75 56 79 42 46 ...
$ Gender : Factor w/ 2 levels "female","male": 2 2 2 2 2 2 2 2 2 2 ...
$ Smoking_2gps : int 1 0 0 0 0 1 0 1 0 0 ...
$ COPD : Factor w/ 2 levels "no","yes": 1 1 1 1 1 1 1 1 1 1 ...
$ Diabetes1.0 : int 0 0 0 0 0 0 0 1 0 0 ...
$ Urgent.emergent_procedure : Factor w/ 2 levels "elective","Urgent/emergent procedure": 1 1 1 1 2 1 1 1 1 1 ...
$ MAE : Factor w/ 2 levels "no","yes": 1 1 1 1 1 1 1 1 1 1 ...
$ Postop.Deep.Sternal.Wound.Infection: Factor w/ 1 level "no": 1 1 1 1 1 1 1 1 1 1 ...
$ Myocardial.Infarction : Factor w/ 1 level "no": 1 1 1 1 1 1 1 1 1 1 ...
$ postop.newDialysis : Factor w/ 2 levels "no","yes": 1 1 1 1 1 1 1 1 1 1 ...
$ Takeback.for.Bleeding : Factor w/ 2 levels "no","yes": 1 1 1 1 1 1 1 1 1 1 ...
$ Discharge.Status : Factor w/ 1 level "alive": 1 1 1 1 1 1 1 1 1 1 ...
$ distance : num 0.021 0.339 0.193 0.206 0.105 ...
$ weights : int 1 1 1 1 1 1 1 1 1 1 ...
$ subclass : int 1 2 3 6 7 9 10 11 12 13 ...
Комментарии:
1. проверьте редактирование.
Ответ №1:
Метод, который я использую, заключается в разделении data.frame, затем cbind
его повторном редактировании, а затем изменении colnames
df <- df[nzchar(df$Status.of.Mitral.Valve), ]
wide <- do.call(cbind, split(df, df$Status.of.Mitral.Valve))
# run install.packages("stringr") if you don't have stringr installed
colnames(wide) <- stringr::str_replace_all(colnames(wide), c("^MS\.(. )$"="\1.1", "^MR\."=""))
И тогда мы можем lapply
все переменные, которые имеют символьный тип, ввести в тест Макнемара:
sapply(colnames(df)[sapply(df, is.factor)], function(x){
tib <- table(wide[paste0(x, c("",".1"))])
if(any(dim(tib)<2)) NULL else mcnemar.test(tib)$p.value
}) -> lst
lst <- lst[!sapply(lst, is.null)]
data.frame(vars=names(lst) , p.value=unlist(lst, use.names=F))
Это дает желаемый результат:
vars p.value
1 Gender 1
2 COPD 1
3 Urgent.emergent_procedure 1
4 MAE 1
Комментарии:
1. Большое спасибо за ваш вклад. Я попробовал ваш код и получил эту ошибку
df <- df[nzchar(df$Status.of.Mitral.Valve)]
‘Ошибка в[.data.frame
(df, nzchar (df $Status.of.Mitral.Valve)): ‘nzchar()’ требуется вектор символов’ затем после преобразования его в символdf$Status.of.Mitral.Valve<-as.character((df$Status.of.Mitral.Valve)) df <- df[nzchar(df$Status.of.Mitral.Valve)]
‘Ошибка в[.data.frame
(df, nzchar (df $ Status.of.Mitral.Valve.Valve)): выбраны неопределенные столбцы ‘ . Пожалуйста, посоветуйте мне.2. @MohamedRahouma Я отредактировал ответ после вашего редактирования, и нет, мы должны это сделать,
df
потому что я использую его для полученияqualitative
переменных дляlapply
3. @MohamedRahouma просто измените значение
lapply
наsapply
, я отредактировал ответ4. @MohamedRahouma Это дает правильный результат см. Мой обновленный ответ
5. @MohamedRahouma извините, что я забыл отредактировать
sapply
, проверьте редактирование