如何解决根据子类对2个匹配的队列进行重塑,然后进行连续的McNemar测试
我想
- 将我匹配的数据(MR与MS)重塑为所附屏幕截图所示;基本上具有相同的列标题,但添加了指向第二组(MS)的“ .1”。这是我对两个同类群组进行排序以获取匹配对(在名为
subclass
的列中)之后的输出,因此我可以在此之后进行McNemar测试。 - 编写一个函数来对连续相似的组(例如
Gender
与Gender.1
,Smoking_2gps
与Smoking_2gps.1
,Diabetes1.0
与Diabetes1.0.1
进行McNemar测试MR组与MS组中的.etc
数据集为here(显示第1页为垂直格式,第2页为水平所需格式)。
我正在考虑针对Status.of.Mitral.Valve
变量中的两个匹配队列MS vs MR,基于子类进行重塑
作为修订
当我尝试使用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 ...
解决方法
我使用的方法是拆分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
将所有具有字符类型的变量都放入McNemar测试中:
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。