R语言是用于统计分析、绘图的语言和 *** 作环境。R是属于GNU系统的一个自由、免费、源代码开放的软件,它是一个用于统计计算和统计制图的优秀工具。天呢,你基础好坑啊,R={r},这是数学符号吧,表示集合R由r构成,sequence_stack 是sequence_stack类型的指针,这里的参数意思是传过来的参数应当是这个类型的指针变量st,第九行那是一个函数,函数的作用是下面的中文解释,函数的返回值是int型,这里没有给出函数体。下面的void类似,表示函数返回类型为空。pop是函数名,这里的字面意思是出栈本文第一大部分将介绍用R软件的meta分析数据包实现相关系数的Meta分析,第二大部分如何用R语言进行多变量的meta分析。
想获取R语言相关系数meta分析的程序模板的同学请在公众号(全哥的学习生涯)内回复“相关系数”即可。
meta数据包提供实现相关系数的Meta分析命令是:metacor(),这个命令通过加权的倒方差法运用相关系数和纳入的样本数来实现相关系数的随机效用模型和固定效用模型的合并,得到合并的相关系数及95%可信区间。具体的命令如下:
metacor(cor, n,studlab, data= NULL, subset=NULL, sm=settings$smcor)
cor为每一个纳入研究的相关系数, n为样本量, studlab纳入研究的标签向量, data为相应的的数据集,sm选项为合并的方法,包括ZCOR和COR,其中ZCOR是合并之前先做Fisher Z变换,COR是直接合并。具体的步骤如下:
library(meta)
data<-readcsv(“C:/Users/86187/Desktop/datacsv”)
录入的数据见图1。
data<-metacor(r,n,data=m1,sm="ZCOR")
在这里合并的方法用的是Fisher Z变换。对样本的相关系数做Fisher Z变换是因为Fisher Z变换可以使样本的相关系数的分布正态分布,尤其是在样本量较小的时候,这样便于进一步估计。一般来说,不管是随机还是固定效应都会先对相关系数做Fisher Z变换。只有很少的情况下才直接用相关系数直接来做分析,比如样本量很大的时候,如果直接合并相关系数,当相关系数值接近1的时候,小样本量研究得到的权重会非常大。因此在这里推荐合并的方法都用(ZCOR)Fisher Z变换。Meta分析的结果见图2。
结果显示,异质性检验Q=616, P=00461, I2=675,可以认为有统计学意义上的异质性。选用随机效用模型,COR=08427, 95%CI: 06264-09385, z=48724, P<00001, 有统计学差异。
具体的命令如下:
forest(a)
从森林图中,非常简单和直观地看到Meta分析的统计结果,见图3
关于这两个方法的介绍请看我之前公众号(全哥的学习生涯)的推送文章(如何用R语言进行meta分析,详细教程一)的内容。敏感性分析和剪补法的结果图分别见图4和图5。
通常Meta分析假定效应量来自于独立的研究,因此统计结果也是独立的。然而,许多研究不能满足独立性的假设,比如多个治疗组与一个共同的对照组比较的研究和多个结局变量的研究就可能产生效应量之间的相关。多变量meta 分析(multivariate meta⁃analysis)作为单变量meta分析的一个拓展,可合并估计多个研究的多个相关参数,这些参数可以是多个结局或多组间的比较。当同一总体中的测量结局相关时,分别对每个结局进行Meta 分析,测量结局之间的相关结构就可能被忽略。多变量Meta分析在随机对照研究中有多种应用,最简单的是在临床试验中把每个组的结局分别处理,其他的应用还有同时探索两个临床结局的治疗效应,或同时探索成本效益的治疗效应,比较多个治疗的联合试验,以及在观察性研究中评估暴露量与疾病之间的相关性,还有在诊断试验和网络干预中的应用。
本次数据来源请见文末的参考文献,主要研究肝硬化的非手术治疗方式预防其出血的危险性,以初次出血的例数为指标,其中三个组分别是:β⁃受体阻滞剂(A),硬化疗法(B),对照组(C),目的是评价这三种非手术治疗方式预防肝硬化出血的效果。,Bled表示初次出血的例数,Total表示干预组的总例数。YAC和YBC分别表示A、B两组相对于C组估计的ln(OR),即干预组的肝硬化初次出血的危险性是对照组的倍数的自然对数;SAA、SBB和SAB则表示其对应方差及两者之间的协方差。对于包含0的研究(研究10和研究20),在每个组增加05个初次出血的例数。整理后见表1。
随后安装调用程序包,并进行加载:
installpackages(‘mvmeta’)
library(mvmeta)。
随后将肝硬化初次出血整理后的数据集data(至少包含YAC、YBC、SAA、SAB、SBB变量)保存为csv格式,然后利用下面命令将其导入R语言。
mvmeta 的语句:mvmeta(formula,S,data,subset,method=“reml”,bscov=“unstr”,model=TRUE,contrasts=NULL,offset,naaction,control=list())
其中formula 表示结局变量名称(即YAC、YBC);S 表示研究内(协)方差(即SAA、SAB、SBB);data 表示数据集名称;method 表示所用的估计方法:固定效应模型时选择FIXED;随机效应模型时则选择
限制性最大似然估计(REML)、最大似然估计(ML)、矩估计(MM)、方差成分法(VC)的其中之一,默认为REML。由输出结果中Q 检验的P 值和I2 统计量来判断异质性以及选择何种效应模型。
mvmeta包中主要提供了多变量Meta分析与多变量的Meta 回归,另外也提供了单变量的Meta 分析和Meta 回归。但对于后两者,在R 语言中的metafor、meta、rmeta 及metalik 等包提供了更多、更详尽和有效的功能。多变量Meta 程序为library(mvmeta),调用mvmeta软件包。
model<-mvmeta(cbind(Ya,Yb),S=S,data=cirrhosis)
model <- mvmeta(cbind(Ya,Yb)~X,S=S,data=cirrhosis),此处X代表协变量。
model<-mvmeta(Y,S=S,data=cirrhosis),此处Y为单变量的效应量,S为效应量方差。
model<-mvmeta(Y~X,S=S,data=cirrhosis),此处X代表协变量。
运行以上程序后,最后将结果输出。
单变量和多变量Meta分析都是采用ln(OR)值做分析。单变量Meta分析时YAC和YBC的Q检验P 值均小于005,I2统计量分别为577%和778%。多变量Meta分析Q检验P<005,I2统计量为739%。可知两种Meta 分析均存在异质性,都用随机效应模型。估计方法选择默认的REML法。
表2 是单变量Meta 分析结果,可得:AC 与BC的OR 值及95%可信区间分别为05281(02802,09955)、05406(03095,09443),表明初次出血的危险性由于干预而降低,即β⁃受体阻滞剂、硬化疗法可以预防肝硬化出血,两者为保护因素。
多变量Meta 分析的结果:YAC 为-06755(-13073,-00438),YBC 为-05938(-11444,-0043 2),研究间相关系数为0436 5(见表3),A组与B组的治疗效果呈正相关。OR 值及95%可信区间分别为0508 9(02705,09571)、05522(0318 4,0957 7),多变量Meta 分析的结果说明β⁃受体阻滞剂预防肝硬化出血的效果是最好,其次是硬化疗法。OR 值的95%可信区间不包含1,上下限均小于1,说明两种疗法与对照组比较的初次出血危险性均小于1,差异有统计学意义。
最后,如果屏幕前的你对R语言学习还有什么问题或者看法,可以在我的公众号(全哥的学习生涯)给我留言,公众号里也有我的个人,我也希望可以结合更多志同道合的伙伴。
感谢你的阅读。R中还有一个有趣的sqldf包,它可以让你用SQL来 *** 作dataframe,这种功能能让会R的人能练习SQL,会SQL的人能练习R,不得不感叹R语言的强大技能和神奇魅力。
当然也可以将R与外部数据库连接,直接在R中 *** 作数据库,并生成最终结果,这也是一种可行的方法。在R中连接数据库需要安装其它的扩展包,根据连接方式不同我们有两种选择:一种是ODBC方式,需要安装RODBC包并安装ODBC驱动。另一种是DBI方式,可以根据已经安装的数据库类型来安装相应的驱动。因为后者保留了各数据库原本的特性,所以个人比较偏好用DBI连接方式。有下面这几种主要的包提供了DBI连接:RMySQL,RSQLite,ROracle,RPostgreSQL。由名字看得出它们分别对应了几种主流的数据库。
注:以上文字来自R-blogger—–《在R语言中使用SQL》
值得一提的是在运用sqldf包时可能要对R软件升级到310版以上,否则安装不会成功,这里简单介绍一种在Windows环境下对R软件自动升级的方法。
Windows上升级R语言:
installpackages("installr");
library(installr) #加载包
updateR()
之后选择“确定”就可以自动更新了
虽然在R语言中有很多优秀的函数如aggregate()和daply()可以对数据框统计,但sql功能强大,不仅能实现数据的清洗、统计、运算,还可以实现数据存储、控制、定义和调用。越来越多的公司在招聘的时候都要求数据分析师除了要掌握统计建模和数据挖掘的理论方法和编程能力外,还要求其具备使用sql的能力,楼主也在积极学习sql当中。
下面是我利用sqldf()完成的一些程序,虽然简单,但这是学习的第一步
> name<-c(rep('张三',1,3),rep('李四',3))
> subject<-c('数学','语文','英语','数学','语文','英语')
> score<-c(89,80,70,90,70,80)
> stuid<-c(1,1,1,2,2,2)
> stuscore<-dataframe(name,subject,score,stuid)
> library(sqldf)
1计算每个人的总成绩并排名(要求显示字段:姓名,总成绩)
> sqldf('select name,sum(score) as allscore from stuscore group by name order by allscore')
name allscore
1 张三 239
2 李四 240
2计算每个人的总成绩并排名(要求显示字段: 学号,姓名,总成绩)
> sqldf('select name,stuid,sum(score) as allscore from stuscore group by name order by allscore')
name stuid allscore
1 张三 1 239
2 李四 2 240
3计算每个人单科的最高成绩(要求显示字段: 学号,姓名,课程,最高成绩)
> sqldf('select stuid,name,subject, max(score) as maxscore from stuscore group by stuid')
stuid name subject maxscore
1 1 张三 数学 89
2 2 李四 数学 90
4计算每个人的平均成绩(要求显示字段: 学号,姓名,平均成绩)
> sqldf('select stuid,name,subject, avg(score) as avgscore from stuscore group by stuid')
stuid name subject avgscore
1 1 张三 英语 7966667
2 2 李四 英语 8000000
5列出各门课程成绩最好的学生(要求显示字段: 学号,姓名,科目,成绩)
> sqldf('select stuid,name,subject,max(score) as maxscore from stuscore group by subject order by stuid')
stuid name subject maxscore
1 1 张三 语文 80
2 2 李四 数学 90
3 2 李四 英语 80
8.列出各门课程的平均成绩(要求显示字段:课程,平均成绩)
> sqldf('select subject,avg(score) as avgscore from stuscore group by subject')
subject avgscore
1 数学 895
2 英语 750
3 语文 750
R语言实际上是函数的集合,用户可以使用base,stats等包中的基本函数,也可以自己编写函数完成一定的功能。但是初学者往往认为编写R函数十分困难,或者难以理解。这里对如何编写R函数进行简要的介绍。
函数是对一些程序语句的封装。换句话说,编写函数,可以减少人们对重复代码书写,从而让R脚本程序更为简洁,高效。同时也增加了可读性。一个函数往往完成一项特定的功能。例如,求标准差sd,求平均值,求生物多样性指数等。R数据分析,就是依靠调用各种函数来完成的。但是编写函数也不是轻而易举就能完成的,需要首先经过大量的编程训练。特别是对R中数据的类型,逻辑判别、下标、循环等内容有一定了解之后,才好开始编写函数。 对于初学者来说,最好的方法就是研究现有的R函数。因为R程序包都是开源的,所有代码可见。研究现有的R函数能够使编程水平迅速提高。
R函数无需首先声明变量的类型,大部分情况下不需要进行初始化。一个完整的R函数,需要包括函数名称,函数声明,函数参数以及函数体几部分。
函数名称,即要编写的函数名称,这一名称就作为将来调用R函数的依据。
2 函数声明,包括 <- function, 即声明该对象的类型为函数。
3 函数参数,这里是输入的数据,函数参数是一个虚拟出来的一个对象。函数参数所等于的数据,就是在函数体内部将要处理的值,或者对应的数据类型。 函数体内部的程序语句进行数据处理,就是对参数的值进行处理 ,这种处理只在调用函数的时候才会发生。函数的参数可以有多种类型。R help的界面对每个函数,及其参数的意义及所需的数据类型都进行了说明。
4 函数体
常常包括三部分
(1) 异常处理
输入的数据不能满足函数计算的要求,或者类型不符, 这时候一定要设计相应的机制告诉用户,输入的数据在什么地方有错误。 错误又分为两种。
第一种, 如果输入的数据错误不是很严重,可以经过转换,变为符合处理要求的数据时, 此时只需要给用户一个提醒,告知数据类型不符,但是函数本身已经 进行了相应的转换。
第二种,数据完全不符合要求,这种情况下,就 要终止函数的运行,而告知因为什么,函数不能运行。这样,用户在 使用函数的情况先才不至于茫然。
(2) 运算过程
包括具体的运算步骤。 运算过程和该函数要完成的功能有关。
R运算过程中,应该尽量减少循环的使用,特别是嵌套循环。R提供了 apply,replicate等一系列函数,来代替循环,应该尽量应用这些函数, 提高效率。 如果在R中实在太慢,那么核心部分只能依靠C或者Fortran 等语言编写,然后再用R调用这些编译好的模块,达到更高的效率。
运算过程中,需要大量用到if等条件作为判别的标准。if和while都是需要数据TRUE/FALSE这样的逻辑类型变量,这就意味着,if内部,往往是对条件的判别,例如 isna, ismatrix, isnumeric等等,或者对大小的比较,如,if(x > 0), if(x == 1), if(length(x)== 3)等等。if后面,如果是1行,则花括号可以省略,否则就必须要将所有的语句都放在花括号中。这和循环是一致的。
例子:
## if与条件判断
funtest <- function(a, b, method = "add"){
if(method == "add") { ## 如果if或者for/while;
res <- a + b ## 等后面的语句只有一行,则无需使用花括号。
}
if(method == "subtract"){
res <- a - b
}
return(res) ## 返回值
}
### 检验结果
funtest(a = 10, b = 8, method = "add")
funtest(a = 10, b = 8, method = "substract")
1首先,我们打开pycharm软件并进入软件的主界面。
2,然后我们添加评论。
3,然后我们编写输入信息语句,myname = input(“username:”)age = int(输入(“age:”)。
4,如果年龄<20岁,我们写下判断条件。
5,如果执行语句打印(“{name}非常年轻”format(name = myname))。
6,然后是,同样如此。
7最后,测试一下。
通过控件的id值获取控件,然后获取控件的是否选择属性来判断RadioButton radioButton=(RadioButton)thisfindViewbyid(Ridxxxx);
if(radioButtonisChecked)
return true;
else
return false;
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)