给一堆数据后怎么用r处理成正态分布_利用R实现自举(bootstrapping)

自举通过重复随机抽样并替换原始样本来生成一个测试统计量或一组测试统计量的经验分布。它允许您生成置信区间并测试统计假设,而不必假设特定的潜在理论分布。用示例来演示自举的逻辑是最容易的。假设您想要计算样本平均值的95%置信区间。您的样本有10个观测值,样本均值为40,样本标准差为5。如果您愿意假设均值的样本分布为正态分布,则可使用下式计算(1-α/2)%置信区间

d9a1b3526f45e8df732e54437d9d3ff0.png

其中t是具有n-1个自由度的t分布的上限1-α/2临界值。对于95%的置信区间,您有40-2.262(5/3.163)

但是如果你不愿意假设均值的抽样分布是正态分布呢?您可以改用自举方法:

1、从样本中随机选择10个观察值,每次选择后替换。有些观测可能会被多次选择,而有些可能根本不会被选择。

2、计算并记录样本均值。

3、将前两个步骤重复1000次。

4、将1000个样本均值从小到大排序。

5、求代表第2.5个百分位数和97.5个百分位数的样本均值。在本例中,它是自下而上的第25个数字。这是你95%的置信限度。

在目前的情况下,样本均值可能是正态分布的,您从bootstrap方法中获得的收益很小。然而,在许多情况下,自举方法是有优势的。如果您想要样本中位数的置信区间,或两个样本中位数之间的差值,该怎么办?这里没有简单的正态理论公式,自举是可选择的方法。如果基础分布未知,如果异常值是个问题,如果样本量很小,或者如果参数方法不存在,自举通常可以提供一种生成置信区间和测试假设的有用方法。

使用boot包做自举

boot包为自举和相关的重采样方法提供了广泛的便利。您可以自举单个统计量(例如,中位数)或一组统计量(例如,一组回归系数)。确保在第一次使用之前下载并安装引导包:install.Packages(“boot”)。自举过程看起来很复杂,但是一旦您回顾了示例,它就会变得很有意义。通常,自举涉及三个主要步骤:

1、编写返回感兴趣的一个或多个统计量的函数。如果只有一个统计量(例如,中位数),则该函数应返回一个数字。如果存在一组统计量(例如,一组回归系数),则该函数应返回向量。

2、通过boot()函数处理此函数,以生成统计数据的R个重复统计量。

3、使用boot.ci()函数获取步骤2中生成的统计信息的置信区间。

现在来谈谈具体情况。主要的引导函数是boot()。它的格式是

bootobject 
  • data:向量、矩阵或数据帧。
  • statistic:生成要引导的k个统计信息的函数(如果引导单个统计信息,则k=1)。该函数应该包括一个索引参数,boot()函数可以使用该参数为每个复制选择对象(请参阅正文中的示例)。R:自举重复次数。
  • ...:要传递给生成感兴趣的统计量的函数的附加参数。

boot()函数调用统计函数R次。每次,它从整数1:nrow(data)生成一组带有替换的随机索引。这些指标在统计功能中用于选择样本。对样本进行统计,并将结果累加到bootobject结构中。bootobject结构描述如下。

  • t0:应用于原始数据的k个统计量的观测值
  • t:为R×k矩阵,其中每行都是k个统计量的自举重复数字。

您可以用bootobject$t0bootobject$t来访问这些元素。

一旦生成自举示例,就可以使用print()plot()来检查结果。如果结果看起来合理,您可以使用boot.ci()函数来获取统计量的置信区间。格式为

boot.ci(bootobject, conf=, type= ) 

其参数解释如下:

  • bootobject:由boot()函数生成的对象
  • conf:期望的置信区间(默认值:conf=0.95)
  • type:返回的置信区间类型。可能的值为norm, basic, stud, perc, bcaall(默认值:type=”all”)

type参数指定获取置信极限的方法。样本均值示例中演示了perc方法(百分位数)。bca提供了一个对偏差进行简单调整的间隔。我发现bca在大多数情况下更可取。有关这些方法的介绍,请参阅Mooney和Duval(1993)。在接下来的小节中,我们将介绍如何自举单个统计量和一组统计量。

自举单个统计量

mtars数据集包含1974年《汽车趋势》杂志报道的32辆汽车的信息。假设您正在使用多元回归根据汽车重量和发动机排量来预测每加仑汽油行驶里程。除了标准的回归统计数据外,您还希望获得R平方值(预测值解释的响应变量的方差百分比)的95%置信区间。可以使用非参数自举来获得置信区间。

第一个任务是编写用于获取R平方值的函数:

rsq 

该函数从回归中返回R平方值。要使boot()能够选择样本,需要使用d语句。然后,您可以使用以下代码绘制大量的自举复制值(比方说,1,000个):

library(boot)set.seed(1234)results 

可以使用以下命令打印boot对象

print(results)
bda345780c4b187819649768cf6dcf41.png

并使用plot(results)进行绘图。结果图如下图所示。

018d6bd57b42ca9aa6fec89c47fbfd4b.png

在上图中,您可以看到自举R平方值的分布不是正态分布。R平方值的95%置信区间可以使用

boot.ci(results, type=c("perc", "bca"))
e1c26d99293e1f0bb18957402ff2514d.png

您可以从这个示例中看到,生成置信区间的不同方法可能会导致不同的区间。在这种情况下,偏差调整间隔与百分位数方法略有不同。在任何一种情况下,零假设H0:R-Square=0都将被拒绝,因为零在置信范围之外。

自举多个统计量

在前面的示例中,自举用于估计单个统计(R平方)的置信区间。继续这个示例,让我们获得统计向量的95%置信区间。具体地说,让我们得到三个模型回归系数(截距、车重和发动机排量)的置信区间。

首先,创建一个返回回归系数矢量的函数:

bs 

然后使用此函数自举1,000个重复数据:

library(boot)set.seed(1234)results 
3f0f9ff3fde273dd098ecf18a20cc70c.png

在自举多个统计量时,向plot()和boot.ci()函数添加一个索引参数,以指示要分析的bootobject$t的哪一列。在本例中,索引1指的是截距,索引2指的是汽车重量,索引3指的是发动机排量。要绘制汽车重量的结果,请使用

plot(results, index=2)
94266de254b893a4406c817f22672ff5.png

要获得汽车重量和发动机排量的95%置信区间,请使用

boot.ci(results, type="bca", index=2)
8c5bfda833d1f703b43a1228164f5bd1.png
boot.ci(results, type="bca", index=3)
0ca1a43ca9f43da327810d5772b72784.png

注意,前面的示例每次都会对整个数据样本进行重采样。如果您可以假设预测变量有固定的水平(通常在计划的实验中),那么您最好只对残差项进行重采样。有关简单的解释和算法,请参阅Mooney和Duval(1993,第16-17页)。

在我们结束自举的讲解之前,有必要解决经常出现的两个问题:

  • 原始样本需要多大?
  • 需要多少次重复?

第一个问题没有简单的答案。有人说,只要样本能代表总体,原始样本量为20-30就足以获得好的结果。从感兴趣的总体中随机抽样是确保原始样本代表性的最可信的方法。关于第二个问题,我发现在大多数情况下,1000次重复已经足够了。计算机的算力很便宜,如果需要,您可以随时增加重复次数。

有许多关于排列测试和自举的有用信息来源。一个很好的起点是Y u(2003)的一篇在线文章。Good(2006)总体上提供了重采样的全面概述,并包括R代码。Mooney和Duval(1993)提供了一个很好的、容易理解的自举介绍。关于自举的权威来源是Efron和Tibishani(1998)。最后,还有许多很棒的在线资源,包括Simon(1997)、Canty(2002)、Shah(2005)和Fox(2002)。

欢迎继续点赞和关注!

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页