如何在R中使用CEM包查找精确匹配

如何在R中使用CEM包查找精确匹配,r,R,我试图使用R中的CEM库在我的数据集中找到精确的匹配项。这是我给出的数据集。 我正在使用以下代码,但在运行CEM函数以查找精确匹配时出错 ##loading CEM Package for Exact Matching require(cem) Dataset_Patient <- read.csv(file.choose(), header = TRUE) ## Loading Dataset Le <- data.frame(na.omit(Dataset_Pati

我试图使用R中的CEM库在我的数据集中找到精确的匹配项。这是我给出的数据集。

我正在使用以下代码,但在运行CEM函数以查找精确匹配时出错

    ##loading CEM Package for Exact Matching
require(cem)

Dataset_Patient <- read.csv(file.choose(), header = TRUE) ## Loading Dataset

Le <- data.frame(na.omit(Dataset_Patient)) ## Converting Dataset into Dataframe

str(Le) ## Check the Structure of Dataset as Variables

tr <- which(Le$TXA==0) ## Grouping the dataset according to TXA No / Yes 
ct <- which(Le$TXA==1)
ntr <- length(tr)
nct <- length(ct)

## Calculate Mean to find out the difference 
mean(Le$TXA[tr]) - mean(Le$TXA[ct])
mean(Le$Sex[tr]) - mean(Le$Sex[ct])
mean(Le$Age[tr]) - mean(Le$Age[ct])
mean(Le$HTN[tr]) - mean(Le$HTN[ct])
mean(Le$Pulmonary.HTN[tr]) - mean(Le$Pulmonary.HTN[ct])
mean(Le$Airway.diseases[tr]) - mean(Le$Airway.diseases[ct])
mean(Le$Malignancy[tr]) - mean(Le$Malignancy[ct])
mean(Le$Bleeding.disorders[tr]) - mean(Le$Bleeding.disorders[ct])
mean(Le$On.anticoagulants_antiplatelets[tr]) - mean(Le$On.anticoagulants_antiplatelets[ct])
mean(Le$Required.ICU.admission[tr]) - mean(Le$Required.ICU.admission[ct])
mean(Le$Classification.of.hemoptysis[tr]) - mean(Le$Classification.of.hemoptysis[ct])
mean(Le$Respiratory.support.[tr]) - mean(Le$Respiratory.support.[ct])

## selection of Columns in the Dataset for CEM Analysis and Matching 
vars <- c("Sex", "Age", "Smooking", "HTN", "Pulmonary.HTN", "Airway.diseases", "Malignancy", "Bleeding.disorders", "On.anticoagulants_antiplatelets", "Required.ICU.admission","Classification.of.hemoptysis","Respiratory.support.")

imbalance(group=Le$TXA, data=Le[vars])

todrop <- c("TXA", "Age")
imbalance(group=Le$TXA, data=Le[vars], drop=todrop)

mat <- cem(treatment = "treated", data = Le, keep.all=TRUE)
mat
##加载CEM包以实现精确匹配
要求(cem)

数据集\u Patient问题在于,几乎没有高水平的
SOFA.score
数据。这是
SOFA.评分表
TXA

#     0  1
# 0  53  2
# 1  63  0
# 2  66  1
# 3  20  0
# 4  22  1
# 5  27  1
# 6  21  2
# 7  16  0
# 8  10  0
# 9  12  0
# 10  8  1
# 11  5  1
# 12  4  1
# 13  2  0
# 14  1  0
# 15  1  0
# 16  1  0
# 19  0  1
如果更改
SOFA.score
的默认切点,则可以解决以下问题:

mat <- cem(treatment = "TXA", data = Le[,c("TXA", "Age", "Smooking", "HTN", 
                                            "Airway.diseases", "Malignancy", 
                                            "Bleeding.disorders", 
                                            "On.anticoagulants_antiplatelets", 
                                            "Required.ICU.admission", 
                                            "Classification.of.hemoptysis", 
                                            "Respiratory.support.", 
                                           "SOFA.score")], 
           keep.all=TRUE, baseline.group="1", 
           cutpoints=list(SOFA.score=c(0, 4.5, 9.5, 14.5, 19.5)))
您可能需要调整其他变量的切点(特别是具有许多不同级别的变量),也可能需要调整
SOFA.score
,以匹配更多情况


编辑:使用单个变量 要循环使用所有变量,可以执行以下操作:

vars <- c("Age", "Smooking", "HTN", 
  "Airway.diseases", "Malignancy", 
  "Bleeding.disorders", 
  "On.anticoagulants_antiplatelets", 
  "Required.ICU.admission", 
  "Classification.of.hemoptysis", 
  "Respiratory.support.", 
  "SOFA.score")
out <- lapply(seq_along(vars), function(i){
  mtch <- cem(treatment = "TXA", data = Le[,c("TXA", vars[i])], 
           keep.all=TRUE, baseline.group="1", 
           cutpoints=list(SOFA.score=c(0, 4.5, 9.5, 14.5, 19.5)))
  Le[mtch$matched,  c("Record", "TXA", vars[i])]})
names(out) <- vars

vars给定您共享的代码,数据集中没有名为
treated
的变量,因此我在调用
cem()
时使用
TXA
代替
treated
。您得到一个错误,因为它找不到任何匹配项。在识别匹配案例的阶段,没有匹配案例,因此返回一长串
NA
值。当函数试图使用这些参数来识别观测值时,它会抛出一个错误。嗨,bro@DaveArmstrong,我也用TXA变量对它进行了测试。处理过的变量不是此数据集的一部分。我收到以下错误。@DaveArmstrong在
[.default
(tmp,x,bg)中出错:下标超出范围。另外:警告消息:在reduce.var(数据[[I]],切点[[vnames[I]])中:NAs由强制Davearmstrong引入谢谢兄弟,现在我的问题是,如果我想检查TXA与每个变量的匹配,我应该用单个变量重复此代码,还是有另一种方法使用循环自动逐个执行?检查
TXA
与每个变量的匹配是什么意思?您可以找到e匹配矩阵
Le[mat$matched,]
我的意思是,如果我想检查税收和年龄之间的匹配,那么我只需要删除代码中的所有其他变量,只保留代码中的这两个变量。接下来是性别和税收等。因此,我必须重复多次代码。有什么方法可以在代码中使用循环自动执行此操作吗?我希望如此你明白我的意思了。你可以,但是每一个都只匹配一个变量,其他变量都不匹配。我怀疑这是你想要的,或者是吗?是的,我的意思是单个变量
vars <- c("Age", "Smooking", "HTN", 
  "Airway.diseases", "Malignancy", 
  "Bleeding.disorders", 
  "On.anticoagulants_antiplatelets", 
  "Required.ICU.admission", 
  "Classification.of.hemoptysis", 
  "Respiratory.support.", 
  "SOFA.score")
out <- lapply(seq_along(vars), function(i){
  mtch <- cem(treatment = "TXA", data = Le[,c("TXA", vars[i])], 
           keep.all=TRUE, baseline.group="1", 
           cutpoints=list(SOFA.score=c(0, 4.5, 9.5, 14.5, 19.5)))
  Le[mtch$matched,  c("Record", "TXA", vars[i])]})
names(out) <- vars