CPAN是 “The Comprehensive Perl Archive Network”的缩写,是指与Perl 语言有关的模块仓库,Perl语言是简单易用的跨平台编程语言,可以运行在Unix、Linux、Windows、MacOS等多种操作平台上。Perl 语言在处理文本资料、管理数据库、运行CGI网关程序等方面运用非常广泛。值得一提的是,由于Perl强大的正则表达能力,近年来在生物信息技术领域的应 用越来越广泛,已经成为在该领域最重要的编程语言。
和Perl语言一样,CPAN中的资源是免费和开源的,目前CPAN已经包含数千个Perl 模块,涉及到编程领域中各方面的问题,当然也包含统计学方面的模块。
通过在https://search.cpan.org/网站的搜索,我们可以找到一些CPAN网站上的统计模块,发现这些模块简单易用、功能强大。和商业统计软件相比,这些免费的统计模块更适合通常的医学卫生统计。
在Windows系统中安装模块时会使用到nmake命令,这是一个50K大小的编译程序,可以在微软官方网站下载,下载网址是:ftp://ftp.microsoft.com/Softlib/MSLFILES/nmake15.exe。下载后拷贝nmake15.exe到c:\perl\bin中运行,自动解压为nmake.exe和nmake.err两个文件,然后就可以正常安装Perl模块了。
2 统计模块的安装与计算测试
2.1 R×C列联表卡方计算模块
R×C列联表卡方计算模块是Statistics::ChisqIndep,由于模块相互关联的原因,在安装这个模块前需要先安装Statistics::Distributions。这两个模块合起来不到10K大小。下载后解压缩,安装过程如下:
在Linux系统安装模块的命令为:
perl makefile.pl
make
make test
make install
在Windows系统安装模块的命令为:
perl makefile.pl
nmake
nmake test
nmake install
笔者在安装这两个模块过程中没有遇到问题,安装后我们参考一下模块自带的示范代码就可以进行卡方计算了。
下面我们通过一例行列表的卡方计算来测试这个模块的运行情况:
141例脑肿瘤患者的类型和发生部位[1]
这是一例3×3列联表的卡方计算问题,笔者直接使用模块示范代码来计算,运行结果如下:
Rows: 3
Columns: 3
Degree of Freedom: 4
Total Count: 141
Chi?square Statistic: 7.84408177408177
p?value: 0.097460
Warning: some of the cell counts might be too low.
123rtotal1239638(21.02)(9.97)(7.01)2214328(15.49)(7.35)(5.16)334241775(41.49)(19.68)(13.83)ctotal783726141123rtotal1239638(21.02)(9.97)(7.01)2214328(15.49)(7.35)(5.16)334241775(41.49)(19.68)(13.83)ctotal783726141
Rows: 3
Columns: 3
Degree of Freedom: 4
Total Count: 141
Chi?square Statistic: 7.84408177408177
p?value: 0.097460
Warning: some of the cell counts might be too low.
123rtotal1239638(21.02)(9.97)(7.01)2214328(15.49)(7.35)(5.16)334241775(41.49)(19.68)(13.83)ctotal783726141
此例原文中的计算结果为χ2=7.84,查表得P>0.05。
经过对比,我们看到程序运行后计算结果准确、分析完整,该模块也适用于四格表的卡方计算。
2.2 四格表Fisher确切概率计算模块
有关四格表Fisher确切概率计算的模块,我们可以找到Text?NSP,这个模块支持Fisher的双侧检验和单侧检验,目前版本是1.03。下载后解压缩,Linux系统上安装命令为:
perl makefile.pl
make
make test
make install
在Windows环境下需要使用nmake,安装命令为:
perl makefile.pl
nmake
nmake test
nmake install
笔者在Windows安装时遇到nmake的提示,要把makefile文件末尾“@echo”开头的几行删除,然后就可以安装成功了。
在使用之前我们要注意这个模块中的图解:
n11 n12 | n1p
n21 n22 | n2p
------
np1 np2 npp
模块自带的示范代码如下:
use Text::NSP::Measures::2D::Fisher::twotailed;
my $n1p = 20; my $np1 = 20; my $n11 = 10; my $npp = 60;
$twotailed_value = calculateStatistic(n1p=>$n1p, np1=>$np1,
npp=>$npp, n11=>$n11);
print getStatisticName."value for bigram is ".$twotailed_value;
我们发现,该模块计算函数的四个参数并不是我们通常使用的a、b、c、d,而是a、(a+b)、(a+c)、(a+b+c+d),笔者没有研究为什么模块 的作者这样处理函数的参数,如果按照我们通常的习惯输入a、b、c、d四个数值进行计算,也是很简单的,只需将示范代码稍作修改即可,修改代码如下:
use Text::NSP::Measures::2D::Fisher::twotailed;
print ("请依次输入四格表a b c d的值,空格隔开:\n");
$input = ;
chomp ($input);
@t = split (" ",$input);
my $n11 = $t[0];
my $n1p = $t[0]+$t[1];
my $np1 = $t[0]+$t[2];
my $npp = $t[0]+$t[1]+$t[2]+$t[3];
$twotailed_value = calculateStatistic( n11=>$n11,n1p=>$n1p, np1=>$np1, npp=>$npp);.
print getStatisticName."value for bigram is ".$twotailed_value;
为了测试计算是否准确,笔者在期刊网查到一篇文章,该文章对比了几种统计软件对四格表确切概率计算的结果,对其中部分四格表数据我们使用Text::NSP模块进行计算,把计算结果和其他软件进行对比:
几种统计软件结果比较[2]
我们可以看到,Text::NSP模块的计算结果和SAS、
SPSS等商业统计软件的计算结果是一样的。
3 讨论
经过测试,CPAN网站上的统计模块比较专业,计算结果准确,完全可以满足医疗卫生的统计需求。
由于CPAN提供的模块都是开源的,我们可以通过分析源代码来了解编程实现的过程。在模块提供的示范代码的基础上,可以很容易编写出特殊统计功能的程序,来满足科学研究的需要,比如对大规模列联表数据的自动化处理。在商业统计软件之外,又有了一个免费而且专业的选择。