使用R中的MatchIt包实现倾向性评分匹配( PSM)
看到很多站友都在用SPSS进行PSM(Propensity Score Matching),也遇到了很多问题,在这里我推荐大家使用R。相较于SPSS而言,R的优势在于它的简便性、兼容性、可视化等。
我将示例数据放在了附件,可供大家下载参考;代码可以直接复制进R进行操做,“#”为注释内容;这里我们对删失(censored)和未删失(uncensored)的患者进行匹配
###基于 R 3.6.0
###安装软件包
install.packages("MatchIt")
###数据准备
rm(list = ls()) #清除R工作环境
setwd("F://Rstore") #定义R的工作路径
library(MatchIt) #加载MatchIt包
data <- read.csv("data.csv") #载入数据并命名为data
###开始进行匹配
###先将data中的group定义为逻辑型变量,如果为"uncensored"则返回'TRUE',否则返回'FALSE'
###这里一定注意定义为'TRUE'的变量必须少于定义为'FALSE'的变量
### y~x分别为干预(分组)因素和需要匹配的变量,即group2为干预(分组)因素,gender、age和TNM则作为需要匹配的变量,然后将文件赋值为data_match
### method为匹配算法,具体参见MatchIt包的说明,一般采用“近邻法”进行匹配
### ratio为匹配的比例,默认为1:1,一般来说也这样选择。如果对照组人数是干预组的若干倍,那ratio的值可以稍大一点,如2:1
###caliper代表的是卡钳值,反应实验组与对照组在进行配对时允许的误差,如果设定为0.02,则实验组与对照组按照倾向性评分±0.02进行匹配(如果不加卡钳值,则实验组全部被匹配)
data$group2 <- as.logical(data$group == 'uncensored')
data_match <- matchit(group2~gender+age+TNM, data = data, method="nearest", ratio=1, caliper = 0.02)
summary(data_match) #汇总结果,重点关注红框里的内容
plot(data_match, type = "jitter") #绘制匹配前后倾向值评分的分布图
plot(data_match, type = "hist") #绘制匹配前后倾向值评分的直方图
###安装软件包
install.packages("tableone")
###统计检验:采用'tableone'包(Creates 'Table 1', i.e., description of baseline patient characteristics, which is essential in every medical research. Supports both continuous and categorical variables, as well as p-values and standardized mean differences. Weighted data are supported via the 'survey' package. See 'github' for a screen cast. 'tableone' was inspired by descriptive statistics functions in 'Deducer' , a Java-based GUI package by Ian Fellows. This package does not require GUI or Java, and intended for command-line users)
###factorVars为非类型变量,strata为分组
dta_m <- match.data(data_match)
library(tableone)
table1 <- CreateTableOne(vars = c('gender', 'age', 'TNM'),
data = dta_m,
factorVars = c('gender', 'TNM'),
strata = 'group')
table1
可以看到匹配后各组的情况,p值均大于0.05
###数据导出
write.csv(dta_m, file = "data.match.csv")
打开csv文件,distance为倾向值得分的分值, weights 为权重
--------------------------------------------------2019-11-03更新--------------------------------------------------
有很多站友想知道谁匹配了谁,今日更新,语句以简单为主,不清楚的麻烦看看附件“MatchIt1”和“MatchIt2”,或者自行谷歌百度哦。
d1 <- data_match$match.matrix
d2 <- rownames(d1)
rownames(d1) <- NULL
pairs <- cbind(d2, d1)
colnames(pairs)[1:2] <- c("group1", "group2")
write.csv(pairs, file = "pairs.csv")
另外,只提问不点赞的什么鬼,都给我出来(╬◣д◢)
最后编辑于 2019-11-03 · 浏览 5.0 万