当我们拿到需要建模的数据时,总是会觉得数据混乱不堪,尤其是数据库分析时,或者实际的临床数据,其中各种指标都存在,比如临床上基本上都包含的性别,年龄,肿瘤的临床分期,生存时间(PFS/DFS/OS)等信息,这是我们需要对每列给出来的指标进行清晰的分类处理才能够更好的构建预测模型。
那么我们就看下需要怎么区分各种变量以及制作第一张表格--基线表。
因变量
因变量(dependent variable)是函数中的专业名词,也叫函数值。函数关系式中,某些特定的数会随另一个(或另几个)会变动的数的变动而变动,就称为因变量。如:Y=f(X)。此式表示为:Y随X的变化而变化,即为结果。
自变量
自变量是会引起其他变量发生变化的变量,是被操纵的。自变量是会引起其他变量发生变化的变量,是被操纵的。
自变量类型
分类变量
分类变量包含有限的分类数或可区分组数。分类数据可能不是逻辑顺序,其包括二分类和多分类,例如,分类变量包括性别、肿瘤分期、生死等。
离散变量
离散变量是在任意两个值之间具有可计数的值的数值变量。离散变量始终为数值变量。
连续变量
连续变量是在任意两个值之间具有无限个值的数值变量。连续变量可以是数值变量,也可以是日期/时间变量。例如,年龄,或者随访的日期和时间。
如果您有离散变量而且想要将其包括在回归或方差分析模型中,可以决定是将其视为连续预测变量(协变量),还是分类变量(因子)。如果离散变量具有许多水平,那么最好将其视为连续变量。将预测变量视为连续变量意味着简单线性或多项式函数足以描述响应和预测变量之间的关系。当您将预测变量视为分类变量时,离散响应值将与变量的每个水平拟合,而不必考虑预测变量水平的顺序。使用此信息,除了可以进行分析以外,还可以确定哪个变量最适合您的情况。
下面我们看一个例子,比如肺癌的数据 lung, 其中数据有10列,每列数据类型,可通过 str() 函数进行查看,发现每列都是数值型的,而我们希望有分类的数据,比如 status , sex 等变量,如下:
#install.packages("tableone")
library("survminer")
library("tableone")
data(lung)
head(lung)
inst time status age sex ph.ecog ph.karno pat.karno meal.cal wt.loss
1 3 306 2 74 1 1 90 100 1175 NA
2 3 455 2 68 1 0 90 90 1225 15
3 3 1010 1 56 1 0 90 90 NA 15
4 5 210 2 57 1 1 90 60 1150 11
5 1 883 2 60 1 0 100 90 NA 0
6 12 1022 1 74 1 1 50 80 513 0
str(lung)
'data.frame': 228 obs. of 10 variables:
$ inst : num 3 3 3 5 1 12 7 11 1 7 ...
$ time : num 306 455 1010 210 883 ...
$ status : num 2 2 1 2 2 1 2 2 2 2 ...
$ age : num 74 68 56 57 60 74 68 71 53 61 ...
$ sex : num 1 1 1 1 1 1 2 2 1 1 ...
$ ph.ecog : num 1 0 0 1 0 1 2 2 1 2 ...
$ ph.karno : num 90 90 90 90 100 50 70 60 70 70 ...
$ pat.karno: num 100 90 90 60 90 80 60 80 80 70 ...
$ meal.cal : num 1175 1225 NA 1150 NA ...
$ wt.loss : num NA 15 15 11 0 0 10 1 16 34 ...
lung
table(lung$inst)
1 2 3 4 5 6 7 10 11 12 13 15 16 21 22 26 32 33
36 5 19 4 9 14 8 4 18 23 20 6 16 13 17 6 7 2
table(lung$time) ##连续型变量
table(lung$status)
1 2
63 165
table(lung$age) ##连续型变量
table(lung$sex)
1 2
138 90
table(lung$ph.ecog)
0 1 2 3
63 113 50 1
table(lung$ph.karno)
50 60 70 80 90 100
6 19 32 67 74 29
table(lung$pat.karno)
30 40 50 60 70 80 90 100
2 2 4 30 41 51 60 35
table(lung$meal.cal)
96 131 169 238 271 280 288 305 313 338 346 363 384 388 413 438 463 475 488 513 538 575 588 613 625 635 675 710 713
1 1 1 1 1 1 1 1 1 2 1 1 1 1 6 1 2 1 4 4 4 1 5 1 1 1 2 1 1
725 730 731 750 768 775 825 860 875 910 925 975 993 1025 1030 1039 1060 1075 1100 1125 1150 1175 1225 1275 1300 1425 1500 2200 2350
2 1 1 1 3 1 9 1 5 3 5 9 1 24 1 1 1 12 1 1 3 13 14 1 6 2 4 1 1
table(lung$wt.loss)
-24 -16 -15 -13 -11 -10 -8 -7 -5 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 22 23 24 25
1 1 1 1 1 1 1 1 4 4 6 5 34 6 9 7 8 10 5 6 8 1 13 5 2 5 4 10 3 3 2 1 9 1 5 2 1
27 28 29 30 31 32 33 34 36 37 38 39 49 52 60 68
4 2 1 4 1 2 2 1 1 3 1 1 1 1 1 1
通过上述的数据的展示,因变量就是 status , 我们可以对其他9列数据进行自变量的分类,如下:
分类变量:sex (二分类变量),ph.ecog(多分类变量)
离散变量:ph.karno, pat.karno
连续变量:inst, time, age, meal.cal, wt.loss
在这里离散型变量 ph.karno, pat.karno 有许多水平,那么最好将其视为连续变量,此时我们修改分类变量的属性,如下:
lung$status=factor(lung$status,levels = c(1,2),labels = c("Dead","Alive"))
lung$sex=factor(lung$sex,levels = c(1,2),labels = c("Male","Female"))
lung$ph.ecog=factor(lung$ph.ecog,levels = c(0,1,2,3),labels = c(0,1,2,3))
str(lung)
'data.frame': 228 obs. of 10 variables:
$ inst : num 3 3 3 5 1 12 7 11 1 7 ...
$ time : num 306 455 1010 210 883 ...
$ status : Factor w/ 2 levels "Dead","Alive": 2 2 1 2 2 1 2 2 2 2 ...
$ age : num 74 68 56 57 60 74 68 71 53 61 ...
$ sex : Factor w/ 2 levels "Male","Female": 1 1 1 1 1 1 2 2 1 1 ...
$ ph.ecog : Factor w/ 4 levels "0","1","2","3": 2 1 1 2 1 2 3 3 2 3 ...
$ ph.karno : num 90 90 90 90 100 50 70 60 70 70 ...
$ pat.karno: num 100 90 90 60 90 80 60 80 80 70 ...
$ meal.cal : num 1175 1225 NA 1150 NA ...
$ wt.loss : num NA 15 15 11 0 0 10 1 16 34 ...
##连续自变量
x1<-c("ph.karno", "pat.karno", "inst", "time", "age", "meal.cal", "wt.loss")
##分类自变量
x2<-c("sex","ph.ecog")
基线表实现
那么我们要想看看整个数据集的描述性分析,那么就可以利用 R包 tableone, 效果非常好,通常来说一篇SCI文章的第一个表都会给出样本的基线情况,今天就来讲述一下可以帮我们快速地汇总描述所有样本的基线变量的一个方法。科技论文中Table1(基线资料表)的常见结构和相应统计学方法,如下:
![](https://img.haomeiwen.com/i14607083/e0e6a256d1dccf49.png)
如上表,变量的类型搞清楚会使得分析的时候更加简单,每种变量类型的统计学方法是完全不相同的,这就是为什么我们拿到数据第一时间是观察,之后分析每列数据的属性,然后做一定的整理,最后才开始分析。那么现在看数据的整理情况,如下:
#install.packages("tableone")
library(tableone)
#为了方便查看使用参数和检测方法,如下
CreateTableOne(
vars,
strata,
data,
factorVars,
includeNA = FALSE,
test = TRUE,
testApprox = chisq.test,
argsApprox = list(correct = TRUE),
testExact = fisher.test,
argsExact = list(workspace = 2 * 10^5),
testNormal = oneway.test,
argsNormal = list(var.equal = TRUE),
testNonNormal = kruskal.test,
argsNonNormal = list(NULL),
smd = TRUE,
addOverall = FALSE
)
#########查看数据整理情况,如下:
CreateTableOne(data = lung)
Overall
n 228
inst (mean (SD)) 11.09 (8.30)
time (mean (SD)) 305.23 (210.65)
status = Alive (%) 165 (72.4)
age (mean (SD)) 62.45 (9.07)
sex = Female (%) 90 (39.5)
ph.ecog (%)
0 63 (27.8)
1 113 (49.8)
2 50 (22.0)
3 1 ( 0.4)
ph.karno (mean (SD)) 81.94 (12.33)
pat.karno (mean (SD)) 79.96 (14.62)
meal.cal (mean (SD)) 928.78 (402.17)
wt.loss (mean (SD)) 9.83 (13.14)
惊人的发现,所有的数值变量都以均值标准差的形式描述好了,因子变量频数百分比也描述好了,没想到吧,还有更加详细的统计结果,如下:
#t检验,卡方检验
table1<-CreateTableOne(vars = c(x1,x2), #指定纳入的变量
data=lung, #指定数据集
factorVars = x2, #指定分类变量
strata = "status", #指定分组变量#若不指定则对总体分析做表#
addOverall = FALSE
)
results1<-print(table1,showAllLevels = FALSE)
Stratified by status
Dead Alive p test
n 63 165
ph.karno (mean (SD)) 85.56 (10.89) 80.55 (12.59) 0.006
pat.karno (mean (SD)) 83.97 (14.54) 78.40 (14.40) 0.010
inst (mean (SD)) 13.11 (9.49) 10.31 (7.69) 0.023
time (mean (SD)) 363.46 (221.14) 283.00 (202.81) 0.010
age (mean (SD)) 60.25 (9.74) 63.28 (8.69) 0.024
meal.cal (mean (SD)) 912.77 (453.41) 934.40 (384.29) 0.752
wt.loss (mean (SD)) 9.11 (12.95) 10.12 (13.25) 0.610
sex = Female (%) 37 (58.7) 53 (32.1) <0.001
ph.ecog (%) 0.006
0 26 (41.3) 37 (22.6)
1 31 (49.2) 82 (50.0)
2 6 ( 9.5) 44 (26.8)
3 0 ( 0.0) 1 ( 0.6)
#秩和检验,卡方检验只需要设置nonnormal=x1
table2<-CreateTableOne(vars = c(x1,x2),
data=lung,
factorVars = x2,
strata = "status",
addOverall = FALSE
)
results2<-print(table2,showAllLevels = FALSE,nonnormal=x1)
results2<-print(table2,showAllLevels = FALSE,exact=x2) #Fisher-test
最后将文件导出来,如下:
results1<-print(table1, quote = FALSE, noSpaces = TRUE, printToggle = FALSE)
write.csv(results1,"results1.csv")
稍作简单的整理即可得到SCI文章中的第一张表格了,P-value计算来自统计学t检验,卡方检验,秩和检验等方法,表格整理之后如下:
![](https://img.haomeiwen.com/i14607083/fab511e5a3d18212.png)
怎么样?您学到了没,这就是这么简单,之前都是一个一个计算的,实属过于笨重,现在只需要几句简短的R命令就可以实现表格的绘制了,跟我进群学分析,发SCI文章不用愁,快来吧!
Reference:
lury, BK. and Riedwyl, H. (1986). Standard distance in univariate and multivariate analysis. The American Statistician, 40, 249-251.
Austin, PC. (2009). Using the Standardized Difference to Compare the Prevalence of a Binary Variable Between Two Groups in Observational Research. Communications in Statistics - Simulation and Computation, 38, 1228-1234.
Yang, D. and Dalton, JE. (2012). A unified approach to measuring the effect size between two groups using SAS. SAS Global Forum 2012, Paper 335-2012.
Li, L. and Greene, T. (2013). A weighting analogue to pair matching in propensity score analysis. International Journal of Biostatistics, 9, 215-234.
Austin, PC. and Stuart, EA. (2015). Moving towards best practice when using inverse probability of treatment weighting (IPTW) using the propensity score to estimate causal treatment effects in observational studies. Statistics in Medicine, Online on August 3, 2015.
本文使用 文章同步助手 同步
网友评论