R语言处理非治疗因素在两组变量不均衡的方法(结果为二分类变量)

library(survival)
## Warning: package 'survival' was built under R version 3.6.3
library(compareGroups)
## Warning: package 'compareGroups' was built under R version 3.6.3
data(colon)#加载R内置数据集colon
str(colon)#显示coloon数据集结构
## 'data.frame':    1858 obs. of  16 variables:
##  $ id      : num  1 1 2 2 3 3 4 4 5 5 ...
##  $ study   : num  1 1 1 1 1 1 1 1 1 1 ...
##  $ rx      : Factor w/ 3 levels "Obs","Lev","Lev+5FU": 3 3 3 3 1 1 3 3 1 1 ...
##  $ sex     : num  1 1 1 1 0 0 0 0 1 1 ...
##  $ age     : num  43 43 63 63 71 71 66 66 69 69 ...
##  $ obstruct: num  0 0 0 0 0 0 1 1 0 0 ...
##  $ perfor  : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ adhere  : num  0 0 0 0 1 1 0 0 0 0 ...
##  $ nodes   : num  5 5 1 1 7 7 6 6 22 22 ...
##  $ status  : num  1 1 0 0 1 1 1 1 1 1 ...
##  $ differ  : num  2 2 2 2 2 2 2 2 2 2 ...
##  $ extent  : num  3 3 3 3 2 2 3 3 3 3 ...
##  $ surg    : num  0 0 0 0 0 0 1 1 1 1 ...
##  $ node4   : num  1 1 0 0 1 1 1 1 1 1 ...
##  $ time    : num  1521 968 3087 3087 963 ...
##  $ etype   : num  2 1 2 1 2 1 2 1 2 1 ...
newdata<-na.omit(colon)#删除缺失值

str(newdata)
## 'data.frame':    1776 obs. of  16 variables:
##  $ id      : num  1 1 2 2 3 3 4 4 5 5 ...
##  $ study   : num  1 1 1 1 1 1 1 1 1 1 ...
##  $ rx      : Factor w/ 3 levels "Obs","Lev","Lev+5FU": 3 3 3 3 1 1 3 3 1 1 ...
##  $ sex     : num  1 1 1 1 0 0 0 0 1 1 ...
##  $ age     : num  43 43 63 63 71 71 66 66 69 69 ...
##  $ obstruct: num  0 0 0 0 0 0 1 1 0 0 ...
##  $ perfor  : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ adhere  : num  0 0 0 0 1 1 0 0 0 0 ...
##  $ nodes   : num  5 5 1 1 7 7 6 6 22 22 ...
##  $ status  : num  1 1 0 0 1 1 1 1 1 1 ...
##  $ differ  : num  2 2 2 2 2 2 2 2 2 2 ...
##  $ extent  : num  3 3 3 3 2 2 3 3 3 3 ...
##  $ surg    : num  0 0 0 0 0 0 1 1 1 1 ...
##  $ node4   : num  1 1 0 0 1 1 1 1 1 1 ...
##  $ time    : num  1521 968 3087 3087 963 ...
##  $ etype   : num  2 1 2 1 2 1 2 1 2 1 ...
##  - attr(*, "na.action")= 'omit' Named int  127 128 165 166 179 180 187 188 197 198 ...
##   ..- attr(*, "names")= chr  "127" "128" "165" "166" ...
descrTable(rx~ ., data = newdata)#对比不同术后化疗方案患者的基线信息情况
## Warning in cor(x, y): 标准差为零
## 
## --------Summary descriptives table by 'rx'---------
## 
## ______________________________________________________ 
##              Obs         Lev       Lev+5FU   p.overall 
##             N=610       N=588       N=578              
## ˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉ 
## id        459 (269)   480 (271)   461 (268)    0.354   
## study    1.00 (0.00) 1.00 (0.00) 1.00 (0.00)   0.355   
## sex      0.53 (0.50) 0.56 (0.50) 0.47 (0.50)   0.007   
## age      59.5 (12.0) 60.1 (11.7) 59.9 (12.0)   0.653   
## obstruct 0.20 (0.40) 0.20 (0.40) 0.18 (0.38)   0.473   
## perfor   0.03 (0.17) 0.03 (0.18) 0.03 (0.16)   0.810   
## adhere   0.15 (0.35) 0.15 (0.36) 0.13 (0.34)   0.553   
## nodes    3.83 (3.75) 3.71 (3.60) 3.44 (3.23)   0.143   
## status   0.55 (0.50) 0.53 (0.50) 0.40 (0.49)  <0.001   
## differ   2.08 (0.50) 2.02 (0.52) 2.09 (0.51)   0.033   
## extent   2.89 (0.50) 2.89 (0.43) 2.87 (0.50)   0.508   
## surg     0.30 (0.46) 0.26 (0.44) 0.25 (0.43)   0.166   
## node4    0.28 (0.45) 0.28 (0.45) 0.24 (0.43)   0.331   
## time     1439 (931)  1479 (965)  1716 (922)   <0.001   
## etype    1.50 (0.50) 1.50 (0.50) 1.50 (0.50)     .     
## ˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉ
newdata$treat<-ifelse(newdata$rx=="Obs","obs","chemo")#根据化疗方案分为观察组及化疗组
newdata$status<-factor(newdata$status,labels=c("alive","dead"))#生存状态因子化变为二分变量并赋值
newdata$treat<-as.factor(newdata$treat)#治疗方式因子化
descrTable(treat~ .-rx,show.ratio =TRUE,data = newdata)#不同治疗方式患者的基线信息差异
## Warning in compareGroups.fit(X = X, y = y, include.label = include.label, :
## Variables 'study' have been removed since some errors occurred
## 
## --------Summary descriptives table by 'treat'---------
## 
## ____________________________________________________________________ 
##              chemo        obs            OR        p.ratio p.overall 
##             N=1166       N=610                                       
## ˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉ 
## id         471 (269)   459 (269)  1.00 [1.00;1.00]  0.381    0.381   
## sex       0.51 (0.50) 0.53 (0.50) 1.06 [0.87;1.29]  0.548    0.548   
## age       60.0 (11.8) 59.5 (12.0) 1.00 [0.99;1.00]  0.377    0.380   
## obstruct  0.19 (0.39) 0.20 (0.40) 1.11 [0.87;1.42]  0.408    0.413   
## perfor    0.03 (0.17) 0.03 (0.17) 0.95 [0.54;1.70]  0.873    0.873   
## adhere    0.14 (0.35) 0.15 (0.35) 1.04 [0.79;1.38]  0.768    0.769   
## nodes     3.57 (3.42) 3.83 (3.75) 1.02 [0.99;1.05]  0.145    0.156   
## status:                                                      0.001   
##     alive 626 (53.7%) 274 (44.9%)       Ref.        Ref.             
##     dead  540 (46.3%) 336 (55.1%) 1.42 [1.17;1.73] <0.001            
## differ    2.05 (0.51) 2.08 (0.50) 1.12 [0.93;1.36]  0.232    0.229   
## extent    2.88 (0.46) 2.89 (0.50) 1.05 [0.86;1.29]  0.619    0.629   
## surg      0.25 (0.44) 0.30 (0.46) 1.23 [0.99;1.53]  0.063    0.067   
## node4     0.26 (0.44) 0.28 (0.45) 1.09 [0.87;1.36]  0.457    0.460   
## time      1597 (951)  1439 (931)  1.00 [1.00;1.00]  0.001    0.001   
## etype     1.50 (0.50) 1.50 (0.50) 1.00 [0.82;1.22]  1.000    1.000   
## ˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉ
可以看到两者在surg有差异,为后续分析演示,同时纳入nodes两个变量,考虑这两个变量在组件有差异
descrTable(status~ .-rx,show.ratio =TRUE,data = newdata)
## Warning in compareGroups.fit(X = X, y = y, include.label = include.label, :
## Variables 'study' have been removed since some errors occurred
## 
## --------Summary descriptives table by 'status'---------
## 
## ____________________________________________________________________ 
##              alive       dead            OR        p.ratio p.overall 
##              N=900       N=876                                       
## ˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉ 
## id         470 (264)   463 (275)  1.00 [1.00;1.00]  0.603    0.603   
## sex       0.53 (0.50) 0.51 (0.50) 0.93 [0.77;1.12]  0.460    0.460   
## age       60.0 (11.6) 59.6 (12.3) 1.00 [0.99;1.00]  0.416    0.416   
## obstruct  0.17 (0.38) 0.21 (0.41) 1.27 [1.00;1.61]  0.050    0.050   
## perfor    0.02 (0.15) 0.04 (0.19) 1.51 [0.87;2.63]  0.141    0.139   
## adhere    0.12 (0.32) 0.17 (0.38) 1.58 [1.21;2.06]  0.001    0.001   
## nodes     2.75 (2.46) 4.60 (4.18) 1.21 [1.16;1.25] <0.001   <0.001   
## differ    2.03 (0.49) 2.09 (0.53) 1.27 [1.06;1.53]  0.010    0.010   
## extent    2.81 (0.53) 2.96 (0.41) 2.02 [1.63;2.51] <0.001   <0.001   
## surg      0.24 (0.43) 0.30 (0.46) 1.38 [1.12;1.71]  0.003    0.003   
## node4     0.15 (0.36) 0.38 (0.49) 3.37 [2.69;4.23] <0.001   <0.001   
## time      2323 (447)   741 (586)  1.00 [1.00;1.00] <0.001    0.000   
## etype     1.51 (0.50) 1.49 (0.50) 0.93 [0.77;1.12]  0.448    0.448   
## treat:                                                       0.001   
##     chemo 626 (69.6%) 540 (61.6%)       Ref.        Ref.             
##     obs   274 (30.4%) 336 (38.4%) 1.42 [1.17;1.73] <0.001            
## ˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉ
#以status为结局变量,观察个自变量对结果的影响,可以看到,nodes和surg都是由影响的。所以不同治疗措施的生存结果差异可能是两个因素影响的了
psModel<-glm(status~adhere+differ,family=binomial(link="logit"),data=newdata) 
#以上述挑选的两个自变量为因变量,结局变量为因变量建立二元回归方程
newdata$ps=predict(psModel,type="response")
#计算倾向性评分并在数据集内添加一列为PS的列,内容为评分
newdata$IPTW<-ifelse(newdata$status==1,1/newdata$ps,1/(1-newdata$ps))
#计算各个患者的加权值(IPTW)
fit<-glm(status~treat,family=binomial(link="logit"),data=newdata) 

summary(fit)
## 
## Call:
## glm(formula = status ~ treat, family = binomial(link = "logit"), 
##     data = newdata)
## 
## Deviance Residuals: 
##    Min      1Q  Median      3Q     Max  
## -1.265  -1.115  -1.115   1.241   1.241  
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -0.14778    0.05873  -2.516 0.011861 *  
## treatobs     0.35176    0.10037   3.505 0.000457 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 2461.7  on 1775  degrees of freedom
## Residual deviance: 2449.4  on 1774  degrees of freedom
## AIC: 2453.4
## 
## Number of Fisher Scoring iterations: 3
#在不矫正的情况下观察治疗方式对于生存的影响,P值为0.
fit.IPTW<-glm(status~treat,weights = ps,family=binomial(link="logit"),data=newdata) 
## Warning in eval(family$initialize): non-integer #successes in a binomial glm!
summary(fit.IPTW)
## 
## Call:
## glm(formula = status ~ treat, family = binomial(link = "logit"), 
##     data = newdata, weights = ps)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -1.0116  -0.7744  -0.7291   0.8484   0.9801  
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)  
## (Intercept) -0.12652    0.08363  -1.513   0.1303  
## treatobs     0.34432    0.14285   2.410   0.0159 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1214.4  on 1775  degrees of freedom
## Residual deviance: 1208.5  on 1774  degrees of freedom
## AIC: 679.98
## 
## Number of Fisher Scoring iterations: 3
#可以看到,加权后的P值为0.0159,虽然也有意义,但是在校准后其变小了,说明加权后其效果变小了
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342