很多新手刚才是总是觉得自己没什么可以写的,自己不知道选什么题材进行分析,使用scitable包后这个完全不用担心,选题多到你只会担心你写不完,写得不够快。
今天演示一下使用scitable包深度挖掘一个陌生数据库
先导入R包和数据
library(survival)
library(scitable)
setwd("E:/r/test")
bc<-read.csv("qztp.csv",sep=',',header=TRUE)
这个是个来自私人创建的医院内部数据库,我一个朋友的,变量我就不解释了,这个数据有141个变量,605个数据。变量非常多。我们先把变量导出来
dput(names(bc))
像"SID", “REGDATE”, “REGUID”, "Q1"这些变迁。日期人员的变量没有什么意义,直接删掉,然后定义我们需要研究的全部变量
allVars <-c("Q1120", "Q657", "Q344", "Q27501", "Q27502", "Q27503", "Q18805", "Q13028", "Q27272", "Q27271", "Q27269", "Q27270", "Q79", "Q82", "Q27410_1", "Q27410_2", "Q27410_3", "Q27410_4", "Q27410_5", "Q27410_6", "Q27410_7", "Q27410_8", "Q27410_9", "Q27410_10", "Q27410_11", "Q27410_12", "Q27410_13", "Q27410_14", "Q27410_15", "Q27273", "Q27277", "Q27406", "Q27291", "Q3806", "Q27204", "Q27279", "Q27278", "Q27297", "Q27284", "Q27299", "Q27282", "Q27280", "Q27283", "Q27205", "Q27507_1", "Q27507_2", "Q27507_3", "Q27507_4", "Q27507_5", "Q27507_6", "Q27506_1", "Q27506_2", "Q27506_3", "Q27506_4", "Q27506_5", "Q27506_6", "Q27506_7", "Q27508_1", "Q27508_2", "Q27508_3", "Q27508_4", "Q27508_5", "Q27201", "Q1865", "Q27192", "Q27206", "Q27207", "Q27208", "Q27286", "Q27358", "Q27359", "Q27302_1", "Q27302_2", "Q27302_3", "Q27302_4", "Q27302_5", "Q27302_6", "Q27302_7", "Q27302_8", "Q27302_9", "Q27302_10", "Q27302_11", "Q27302_12", "Q27302_13", "Q27302_14", "Q20503", "Q27407", "Q27301", "Q434", "Q592", "Q1432", "Q441", "Q368", "Q897", "Q374", "Q1066", "Q802", "Q804", "Q1671", "Q6000", "Q371", "Q572", "Q1308", "Q27509", "Q27510_1", "Q27510_2", "Q27510_3", "Q27510_4", "Q27510_5", "Q27510_6", "Q27510_7", "Q27510_8", "Q27510_9", "Q27510_10", "Q27510_11", "Q27510_12", "Q27510_13", "Q27510_14", "Q79.1", "Q79.2", "BMI", "Q27272.NEW", "Q27271.NEW", "Q13028.NEW", "Q27406.CS", "Q27406.CS.NEW", "Q18805.NEW", "Q1432.T3", "BMI.CS", "Q1432.T3.CONT", "Q344.CS", "白球比", "血淋比", "Q27278.NEW", "Q27278.NEW1", "Q27406.NEW", "Q1432YA")
然后定义一下咱们研究的类型,统一定义为“glm”
family<-"glm" #你的研究类型
然后在organizedata2函数中放入数据和全部研究变量
out<-organizedata2(data = bc,allVars = allVars,family=family,username=username,token=token)
咱们可以看到函数报错了,主要是Q27410_13这个变量只有一个类型,属于不合格的变量需要删掉
所以咱们要在allVars中删除函数报错,不合格的变量,直到没有报错位置。
有的人可能会说,变量太多了,自己一个个删太麻烦了。函数还提供了一个探索模式
out<-organizedata2(data = bc,allVars = allVars,family=family,username=username,token=token,explore = T)
上图函数提示上面的变量都被删除了。咱们再out中提出整理好的数据,所有变量和分类变量
data<-out[["data"]]
fvars<-out[["factorvarout"]]
allVars<-out[["allVars"]]
整理好数据以后就可以进一步分析,假设咱们的研究变量、观察变量和模型如下
x<-"Q1432" #你研究的变量
y<-"Q3806" #你的结局变量
family<-"glm" #你的研究类型
这个时候我想先挖掘一下数据,看看哪些变量和Y关联
var<-allVars
tb2<-scitb2(data=data,x=var,y=y,family = family,username=username,token=token)
小于0.05的变量都是和结局有关联的,咱们来看下咱们关心的变量"Q1432"和结局的情况
咱们发现"Q1432"和结局并无关联,是不是这个变量就没有意义了呢?别急着下结论,咱们来进行更加深度的交互效应挖掘,其实就是看各个亚组之间,"Q1432"和结局和结局的关系分层这里放入所有的交互变量就行
Interaction<-fvars
tb5.a<-scitb5a(data=data,x=x,y=y,Interaction=Interaction,cov = cov3,family=family,username=username,token=token)
做了交互效应分析以后,咱们发现两个问题,虽然"Q1432"和结局并无关联,但是再Q27278这个亚组,当Q27278等于0的时候,"Q1432"和结局是线性相关的,理论上有一个亚组相关就可以写一篇文章。
为什么会这样,举个简单的例子,假设你要研究尿酸和痛经的关系?我们知道男性不可能痛经的,但是男性喝酒可能尿酸又高,你的数据中要是男性过多的化就会对结果造成影响,因此,性别就是一个混杂因素,性别分层以后就能得到女性尿酸和痛经的关系,等于是个消除混杂的处理。
交互效应中深度挖掘数据关联通常有两种情况:
**1.**在观察变量和结局没有关联,亚组却发现了有关联意义(咱们数据的情况)
**2.**在观察变量和结局有关联,亚组中却发现关联明显减弱了,拮抗效应,交互P值小于0.05。
第二种情况我拿个文章举例说明
空腹血糖浓度之间的纵向关联中国高血压成人首次卒中:叶酸的影响干预
这篇文章说的是血糖浓度越高,脑梗死发生率越高
但是使用叶酸以后,血糖高的患者,脑梗风险明显下降
表明叶酸是保护因素,其实做法很简单,就是把是否使用叶酸做个分类变量,然后做个交互效应分析而已。写法可以参照这篇文章。
我还想说的是再亚组分段中,咱们把Q1432也做了分段,看到再2这个2亚组中也是有关联的
表明有可能Q1432有一段是有线性关联的,咱们可以通过ggmgcv函数来观察
library(ggscitable)
out2<-ggmgcv(data = data,x="Q1432",y="Q3806",family = "gaussian",username=username,token=token)
最后发现Q1432其实和结局是非线性关联,当Q1432大于120左右,Q1432和结局是线性关联。具体分析还是要通过分段和阈值分析。
最后展望一下
Sctb2和scitb5函数都是线性关系的判断,将来会编写一个图形化判断非线性数据关系的函数
看文字不明白的还有视频介绍
R语言使用scitable包深度挖掘一个陌生数据库