在SCI文章中,交互效应表格(通常是表五)能为文章锦上添花,增加文章的信服力,增加结果的可信程度,还能进行数据挖掘。
交互效应表我在既往文章《R语言手把手教你制作一个交互效应表》已经介绍怎么制作了,详细的可以去看一下。
本次发布我自己写的scitb5函数,参考了forestmodel包和一些其他的R包的写法。用于一键生成交互效应表,主要是可以给你省点时间,也可以进行数据挖掘。
要注意一下,只发布了目标变量X是连续变量的的交互效应函数,买错我可不负责!!
分类变量的还在写,过段时间应该可以发布。
scitb5函数支持逻辑回归、cox回归还有线性回归模型。下面我来演示一下,先做逻辑回归
导入我们的早产数据(公众号回复:早产数据,可以得到数据)
bc<-read.csv("E:/r/test/zaochan.csv",sep=',',header=TRUE)
bc <- na.omit(bc)
names(bc)
dput(names(bc))
先对数据进行一些整理,这一步是必要的,你要分层的变量都要转成因子
bc$race<-ifelse(bc$race=="black",1,ifelse(bc$race=="white",2,3))
bc$smoke<-ifelse(bc$smoke=="nonsmoker",0,1)
bc$low<-factor(bc$low)
bc$race<-factor(bc$race)
bc$ht<-factor(bc$ht)
bc$ui<-factor(bc$ui)
接下来导入函数,我把它写成了一个函数文件1.4final.R,直接使用source导入就可以了
source("E:/r/test/1.4final.R")
导入成功后会出现如下图标,显示有3个函数,这样就说明加载成功了
接下来我们就是要定义交互也就是分层变量,cov1表示在你模型出现的协变量,Interaction表示你要交互也就是分层的变量,我在函数中设定交互变量必须包含在协变量中,不然会报错。
cov1<-c("lwt","smoke","ptl","ui","ftv","race")
Interaction<-c("race","smoke","ui")
定义好以后我们就可以使用scitb5函数了,这个函数需要survival包和lmtest包支持,必须先安装好这两个包,使用函数后会自己加载这两个包。scitb5函数我来解释一下data就是你的数据,必须是数据框形式,x是你的目标变量,目前必须是连续变量,y是你的结局变量,Interaction输入:交互变量,cov输入:协变量,family定义你的模型,逻辑回归就定义为logit。
out<-scitb5(data=bc,x="age",y="low",Interaction=Interaction,cov = cov1,family="logit")
一句话代码交互效应表就生成了。还算相对简单吧。接下来做一个cox回归的,导入乳腺癌数据(公众号回复:乳腺癌,可以得到数据)
library(foreign)
library("survival")
bc <- read.spss("E:/r/Breast cancer survival agec.sav",
use.value.labels=F, to.data.frame=T)
bc <- na.omit(bc)
分类变量转成因子
bc$er<-as.factor(bc$er)
bc$pr<-as.factor(bc$pr)
bc$ln_yesno<-as.factor(bc$ln_yesno)
bc$histgrad<-as.factor(bc$histgrad)
bc$pathscat<-as.factor(bc$pathscat)
dput(names(bc))
定义协变量和交互变量
cov1<-c("pathsize", "lnpos", "er", "pr", "histgrad",
"pathscat", "ln_yesno")
Interaction<-c("histgrad","er", "pr")
使用函数生成交互效应表,使用cox回归必须定义时间,不然会报错
out<-scitb5(data=bc,x="age",y="status",Interaction=Interaction,cov = cov1,time="time",family="cox")
接下来做线性回归,这里使用的是ggplot2包的汽车数据
bc<-as.data.frame(ggplot2::mpg)
dput(names(bc))
分类变量转成因子
bc$cyl<-as.factor(bc$cyl)
bc$model<-as.factor(bc$model)
bc$drv<-as.factor(bc$drv)
bc$fl<-as.factor(bc$fl)
bc$class<-as.factor(bc$class)
bc$trans<-as.factor(bc$trans)
定义协变量和分类变量
cov1<-c("model", "displ","cyl", "trans", "drv",
"cty", "hwy", "fl", "class")
Interaction<-c("drv","fl","class","model")
做表,线性回归中这里系数,使用β表示。
out<-scitb5(data=bc,x="displ",y="hwy",Interaction=Interaction,cov = cov1,family="linear")
这里出现一个问题,为什么我们这里定义了“drv",“fl”,“class”,“model"4个分层变量,然后最终只做出了“drv"这个变量,
信息提示"fl”,“class”,"model"这3个变量不适合进行分层。
[1] “fl is Not suitable for layering”
[1] “class is Not suitable for layering”
[1] “model is Not suitable for layering”
这个问题我等会再说,我们通过一个粉丝的数据来说明这个问题,我们先导入这个数据
bc<-read.csv("E:/r/fensi/final1.csv",sep=',',header=TRUE)
dput(names(bc))
转换分类变量为因子
bc[,c("x2", "x3", "x4", "x5", "x6", "x7")] <- lapply(bc[,c("x2", "x3", "x4", "x5", "x6", "x7")], factor)
str(bc)
定义协变量和交互变量
Interaction<-c("x2", "x3", "x4","x5")
cov<-c("x2", "x3", "x4", "x5", "x6", "x7")
生成表格,这里也是值生成了3个,x5没有生成
out<-scitb5(data=bc,x="x1",y="y",Interaction=Interaction,cov = cov,family="logit")
显示"x5 is Not suitable for layering",意思是x5这个变量不适合做分层交互,为什么呢?我们先来看一下x5这个数据它,分的层很多,分类4个层
levels(factor(bc[,"x5"]))
我们取一个亚组来看看,它x5==1的时候x6、x7的数据全部是0,没有其他的变量了,这样组合不了模型,所以会报错,所以函数会自动放弃这个变量。
be<-subset(bc,bc$x5==1)
所以说,如果你的数据不多,分层变量中分为太多类型,会导致建模失败,不能进行分类。我在在其他的包也试了一下,也是一样建模失败。
获取scitb5函数代码请参看这篇文章:
scitb5函数1.4版本(交互效应函数P for interaction)发布----用于一键生成交互效应表
本函数还在继续更新中,如有错误或者有什么好的建议,欢迎和我联系。