R语言怎么检验分布是不是T分布

Python026

R语言怎么检验分布是不是T分布,第1张

ks.test()实现了KS检验,可以检验任意样本是不是来自给定的连续分布。

你这里的用法就是:

ks.test(data,pt,df=df) #data是样本的数据,df是要检验的t分布的自由度

我们可以用很多方法分析一个单变量数据集的分布。最简单的办法就是直接看数

字。利用函数summary 和fivenum 会得到两个稍稍有点差异的汇总信息。此外,stem

(\茎叶"图)也会反映整个数据集的数字信息。

>attach(faithful)

>summary(eruptions)

Min. 1st Qu. Median Mean 3rd Qu. Max.

1.600 2.163 4.000 3.488 4.454 5.100

>fivenum(eruptions)

[1] 1.6000 2.1585 4.0000 4.4585 5.1000

>stem(eruptions)

The decimal point is 1 digit(s) to the left of the |

16 | 070355555588

18 | 000022233333335577777777888822335777888

20 | 00002223378800035778

22 | 0002335578023578

24 | 00228

26 | 23

28 | 080

30 | 7

32 | 2337

34 | 250077

36 | 0000823577

38 | 2333335582225577

40 | 0000003357788888002233555577778

42 | 03335555778800233333555577778

44 | 02222335557780000000023333357778888

46 | 0000233357700000023578

48 | 00000022335800333

50 | 0370

茎叶图和柱状图相似,R 用函数hist 绘制柱状图。

>hist(eruptions)

>## 让箱距缩小,绘制密度图

>hist(eruptions, seq(1.6, 5.2, 0.2), prob=TRUE)

>lines(density(eruptions, bw=0.1))

>rug(eruptions) # 显示实际的数据点

更为精致的密度图是用函数density 绘制的。在这个例子中,我们加了一条

由density 产生的曲线。你可以用试错法(trial-and-error)选择带宽bw(bandwidth)

因为默认的带宽值让密度曲线过于平滑(这样做常常会让你得到非常有\意思"的密度

分布)。(现在已经有一些自动的带宽挑选方法2,在这个例子中bw = "SJ"给出的结

果不错。)

我们可以用函数ecdf 绘制一个数据集的经验累积分布(empirical cumulative

distribution)函数。

>plot(ecdf(eruptions), do.points=FALSE, verticals=TRUE)

显然,这个分布和其他标准分布差异很大。那么右边的情况怎么样呢,就是火山

爆发3分钟后的状况?我们可以拟合一个正态分布,并且重叠前面得到的经验累积密

度分布。

>long <- eruptions[eruptions >3]

>plot(ecdf(long), do.points=FALSE, verticals=TRUE)

>x <- seq(3, 5.4, 0.01)

>lines(x, pnorm(x, mean=mean(long), sd=sqrt(var(long))), lty=3)

分位比较图(Quantile-quantile (Q-Q) plot)便于我们更细致地研究二者的吻合

程度。

par(pty="s") # 设置一个方形的图形区域

qqnorm(long)qqline(long)

上述命令得到的QQ图表明二者还是比较吻合的,但右侧尾部偏离期望的正态分布。

我们可以用t 分布获得一些模拟数据以重复上面的过程

x <- rt(250, df = 5)

qqnorm(x)qqline(x)

这里得到的QQ图常常会出现偏离正态期望的长尾区域(如果是随机样本)。我们可以用

下面的命令针对特定的分布绘制Q-Q图

qqplot(qt(ppoints(250), df = 5), x, xlab = "Q-Q plot for t dsn")

qqline(x)

最后,我们可能需要一个比较正规的正态性检验方法。R提供了Shapiro-Wilk 检

>shapiro.test(long)

Shapiro-Wilk normality test

data: long

W = 0.9793, p-value = 0.01052

和Kolmogorov-Smirnov 检验

>ks.test(long, "pnorm", mean = mean(long), sd = sqrt(var(long)))

One-sample Kolmogorov-Smirnov test

data: long

D = 0.0661, p-value = 0.4284

alternative hypothesis: two.sided

(注意一般的统计分布理论(distribution theory)在这里可能无效,因为我们用同样

的样本对正态分布的参数进行估计的。)

转载于:

http://www.biostatistic.net/thread-2413-1-1.html

一般根据数据是否符合正态分布,选择合适的统计方法:

T检验,亦称student t检验(Student's t test),主要用于样本含量较小(例如n<30),总体标准差σ未知的正态分布资料。t检验是用t分布理论来推论差异发生的概率, 从而比较两个平均数的差异是否显著。 它与 Z检验 、 卡方检验 并列。

其他进行正态性检验的函数 (如下函数都属于nortest包)

Lillie.test()

ad.test()

cvm.test()

pearson.test()

sf.test()

不同的函数可能会得到不同的结果。

对于不服从正态分布的数据,可以采用一些方法使它服从正态分布。

var.test只能用于两样本方差齐性检验

当数据不满足正态分布的时候,要进行t检验必须进行原始数据的变换。如取log,平方根,倒数, boxCox转换 等。

Wilcox秩和检验(又称Mann-Whitney U检验)是对原假设的非参数检验,在不需要假设两组样本数据为正态分布的情况下,测试二者数据分布是否存在显著差异,此检验适用于数据分布属于非正态性的分析对象,其适用范围相较于t检验广泛。

执行wilcoxon秩和检验(也称Mann-Whitney U检验)这样一种非参数检验 。t检验假设两个样本的数据集之间的差别符合正态分布(当两个样本集都符合正态分布时,t检验效果最佳),但当服从正态分布的假设并不确定时,我们执行wilcoxon秩和检验来验证数据集中mtcars中自动档与手动档汽车的mpg值的分布是否一致,p值<0.05,原假设不成立。意味两者分布不同。警告“无法精确计算带连结的p值“这是因为数据中存在重复的值,一旦去掉重复值,警告就不会出现。

写在最前面:

首先需要说一下,本文的bootstrap和jackknife都算是蒙特卡罗方法(Monte Carlo method)的一种。应用广泛的的MCMC链(马尔可夫链蒙特卡洛方法Markov chain Monte Carlo)也是蒙特卡罗与马尔可夫链的结合。简单来说,蒙特卡罗方法就是从已知样本的分布中随机抽取新的样本集进行评估,然后放回,再次抽取的方法。根据具体方法的不同,抽取样本集的手段也不同。

bootstrap抽样方法将观测到的样本视为一个有限的总体,是唯一的信息来源,从中有放回的随机抽样来评估总体特征,以及对抽样总体进行推断统计。bootstrap 也分参数bootstrap和非参数bootstrap,前者的分布已完全知道。但在生信领域一般没有这种情况。所以下面讨论的是非参数bootstrap。

直接上例子:

假设现在有bootstrap包中的law数据集如下,

现在我们要计算LSAT成绩(美国法学入学考试)和GPA之间的相关系数。但因为样本量太少了,所以我们使用bootstrap重复抽样评估其标准误。

200次循环抽样后,计算得se.R标准误为0.1474629

得到如下的图:

1e6次循环抽样后,计算得se.R标准误为0.1333802

得到如下的图:

如果用bootstrap包的bootstrap函数会快一些:

bootstrap函数的用法: bootstrap(抽取样本范围,重复次数,进行bootstrap的函数,bootstrap的数据集)

偏差定义为bootstrap结果(多个数值)与原数据统计结果(单个数值)的均值:

得到bias大约为0.001817608,比较小

换一个包,boot包

这里用了三种方法计算置信区间:basic、正态和百分数。样本相关系数分布接近正态,则正态置信区间接近百分数区间。此外还有“Better Bootstrap Confivendence Interval” 更好的bootstrap置信区间,称为BCa区间,使用偏差和偏度对百分数置信区间进行矫正。设置type="bca"即可。

简单的说,bootstrap是从原有真实样本中有放回地抽取n个。jacknife就是每次都抽取n-1个样本,也就是每次只剔除一个原样本。

同样地,如果以bootstrap包中的law数据进行演示:

Jackknife计算的bias为-0.006473623。 这里jackknife的偏差公式相比于bootstrap有一个(n-1)系数,推导就不写了。

标准误se为0.1425186,与bootstrap得出的比较接近。

当统计量不太平滑的时候,Jacknife有很大误差。比如说对中位数进行统计,其变化很大。在进行Jacknife之后最好再跑一次bootstrap,看看是否相差很大。

居然还能这么嵌套着玩,针对每次bootstrap形成的数列向量计算jackknife的标准差,这样可以看出bootstrap若干次取样之间的差异。

算出来分别为0.1344824和0.08545141。后者较小,表面bootstrap取样之间的variance较小。

简单来说就是一种数据分割检验的方法,将数据分割为K份,称为"K-fold"交叉检验,每次第i个子集作为测试集来评估模型,其余的用来构建模型。Admixture使用的就是这个原理。Jackknife也属于Cross Validation的应用之一。

现在我创建一个这样的alignment:

这棵树长这样,符合遗传距离:

进行bootstrap:

phylogeny的bootstrap是对每一个节点都进行bootstrap取样并建树,比如说在9号节点,查看其bootstrap子集建的树符合系统发育关系((human2,human4,human3)(human8,human1,human6,human7,human5))的百分比(不管内部怎么样,先看这个节点)。发现Node1支持率是100(1000次都符合)。而后移到下一个节点,并且只看节点内部的分支支持率是多少。

其实原理都比较简单,计算bootstrap也会有专门的软件。

参考资料:

1)中科大张伟平教授课件

2) https://ecomorph.wordpress.com/2014/10/09/phylogenetic-trees-in-r-4/