如何用r语言实现布丰投针问题?

Python014

如何用r语言实现布丰投针问题?,第1张

原文链接:http://tecdat.cn/?p=13033

介绍

布丰投针是几何概率领域中最古老的问题之一。它最早是在1777年提出的。它将针头掷到有平行线的纸上,并确定针和其中一条平行线相交的可能性。令人惊讶的结果是概率与pi的值直接相关。

R程序将根据上段所述的情况估算pi的值并使用gganimate进行动态可视化。

第1部分

对于A部分,我们创建一个数据帧,该数据帧将在3个不同的区间上生成随机值,这些区间将代表x,y的范围以及每个落针点的角度。这是一个易于实现的随机数情况,需要使用runif函数。此功能要求输入数量,后跟一个间隔。生成数字后,我们会将值保存到数据框中。

rneedle <- function(n) {

x = runif(n, 0, 5)

y = runif(n,0, 1)

angle = runif(n,-pi, pi) #从-180到180的角度

values<-data.frame(cbind(x, y, angle))

return(values)

}

values<-rneedle(50)

#检查是否生成50×3矩阵

values

#我们的数据帧已经成功生成。

         x           y      angle

1  4.45796267 0.312440618  1.3718465

2  3.43869230 0.462824677  2.9738367

3  2.55561523 0.596722445 -2.9638285

4  3.68098572 0.670877506 -0.6860502

5  0.03690118 0.202724803 -0.3315141

6  4.64979938 0.180091416 -0.3293093

7  4.92459238 0.172328845 -0.5221133

8  3.50660347 0.752147374  2.9100221

9  2.03787919 0.167897415 -0.3213833

10 0.38647133 0.539615776 -0.1188982

11 3.28149935 0.102886770 -1.6318256

12 3.68811892 0.765077533  1.2459037

13 1.52004894 0.682455494 -0.4219802

14 3.76151379 0.508555610  0.1082087

...

第2部分

我们绘制第一部分中的针。重要的是不要在这个问题上出现超过2条水平线。它使我们可以进行检查以了解此处描绘的几何特性的一般概念。话虽如此,让我们注意我们决定在每个方向上将图形扩展1个单位。原因是想象一个针尾从y = 1开始,其角度为pi / 2。我们需要假设该方向的范围最大为2。

plotneedle(values)

第3部分

在下面,将基于阅读布冯针和基本几何原理的知识,查看pi的估算值。

buffon(values)

第4部分

运行代码后,我们收到以下答案。

>buffon(X)

[1] 3.846154

set.seed(10312013)

X <- rneedle(50)

plotneedle(X)

buffon(X)

>buffon(X)

[1] 3.846154

第5部分

如前几节所述,当我们投掷更多的针头时,我们期望以最小的不确定性获得更准确的答案。从Approxpi函数运行代码后,我们收到了平均值= 3.172314和方差0.04751391的值。对于这样一个简单的实验,它对pi进行了很高的估计。

Approxpi(500)

mean(Approxpi(500))

var(Approxpi(500))

>mean(Approxpi(500))

[1] 3.172314

>var(Approxpi(500))

[1] 0.04751391

接下来对模拟次数从500~600的预测进行动态可视化,红色表示针投放到了直线上:

参考资料

Schroeder,L.(1974年)。布冯针问题:许多数学概念的激动人心的应用。

最受欢迎的见解

1.R语言动态图可视化:如何、创建具有精美动画的图

2.R语言生存分析可视化分析

3.Python数据可视化-seaborn Iris鸢尾花数据

4.r语言对布丰投针(蒲丰投针)实验进行模拟和动态

5.R语言生存分析数据分析可视化案例

6.r语言数据可视化分析案例:探索brfss数据数据分析

7.R语言动态可视化:制作历史全球平均温度的累积动态折线图动画gif视频图

8.R语言高维数据的主成分pca、 t-SNE算法降维与可视化分析案例报告

9.python主题LDA建模和t-SNE可视化

原理参考 文章 ,主要思想我认为是求出所有分布的可能(中间的一般为零假设),出现这种分布的概率。

distribution= 参数可为exact(精确模式,即依据所有可能的排列组合,仅适用于两样本问题)、approxiamate(nresample=#)(蒙特卡洛抽样,#指需要重复的次数)、asymptotic(渐进分布抽样)

lmPerm包更擅长方差分析。示例实验设计仍为5组接受不同治疗方法的多组结果比较。

实验示例仍为关节炎的治疗(两种)与效果(无、部分、显著)间的关系

实验示例为研究文盲率与谋杀率是否相关

主要为 lmp() 、 aovp() 两个函数分别对应参数法的 lm() 线性回归、 aov() 方差分析。主要格式上的区别是添加了 perm= 参数。可以为Exact(精确模式)、Prob(不断从可能的序列中抽样,直至估计的标准差在估计的p值0.1之下)、SPR(使用贯序概率比检验来判断何时停止抽样)。值得注意的是当样本观测大于10,perm="Exact"自动默认转为"Prob",因此精确检验只适用于小样本问题。

(1)简单线性回归

实验示例仍为以身高预测体重的设计

(2)多项式回归

高精度拟合身高体重回归关系

(3)多元回归

探究谋杀率与多因素的回归关系

(1)单因素方差分析

(2)单因素协方差分析

实验示例仍为药物对刚出生小鼠体重影响,协变量为怀孕时间

(3)双因素方差分析(交互效应)

实验示例:两种药物分别在不同剂量下对小鼠牙齿长度的影响。

核心思想是有放回的抽样多次(1000次)

(1)写一个能返回带研究统计量的函数;

(2)确定重复数,使用 boot() 函数处理;(一般重复1000次即可;此外有人认为初始样本大小为20-30即可得到足够好的结果);

(3) boot.ci() 函数计算统计量置信区间。

实验示例:使用mtcar数据框,采用多元回归,根据车重和发动机排量来预测汽车的每加仑行驶的英里数。想获得95%的R平方值(预测变量对响应变量可解释的方差比)的置信区间

(1)首先写函数

(2)然后使用boot()函数

(3)最后boot.ci()函数求置信区间

实验示例:使用mtcar数据框,采用多元回归,根据车总和发动机排量来预测汽车的每加仑行驶的英里数。想获取一个统计量向量--三个回归系数(截距项、车总、发动机排量)95%的置信区间。

数据准备

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

t检验的适用条件为样本分布符合正态分布。

R中检验正态分布的函数:

shapiro.test()

结果p值要是小于0.05,样本分布是非正态分布,如果大于0.05,样本分布是正态分布。

t检验可分为单总体检验和双总体检验,以及配对样本检验。

单总体t检验是检验一个样本平均数与一个已知的总体平均数的差异是否显著。

个人理解的应用实例:已知一个玉米品种的产量是8000 kg/ha,在一个田间试验中测定这个玉米品种的产量,单样本t检验要做的就是检验田间试验测定的产量与已知产量是否相等。

单样本t检验的假设:

H0:样本均值与已知的总体均值相等。

H1:样本均值与已知的总体均值不相等。

t统计量的计算:

m:样本平均值;

:已知总体的均值;

S:样本标准差,自由度df=n-1。

n:样本量。

单样本t检验R调用函数:

t.test(x, mu, alternative = "two.sided")

x:数据向量;

mu:理论平均值。默认为0,可根据自己统计计算需求更改;

alternative:备择假设。允许值为“two.sided”(默认),也可以根据需要设置为“greater”或“less”之一。

结果解释:p值小于0.05,结论是v1的平均值与理论值1.5有显著差异。

检验两个样本平均数与其各自所代表的总体的差异是否显著。

个人理解的应用实例:检验两个玉米品种产量是否存在差异。

t.test(y ~ x, data)

其中的y是一个数值型变量,x是一个二分变量。

t.test(y1, y2)

其中的y1和y2为数值型向量(即各组的结果变量)。可选参数data的取值为一个包含了这些变量的矩阵或数据框。

t检验默认假定方差不相等,并使用Welsh的修正自由度。你可以添加一个参数var.equal=TRUE以假定方差相等,并使用合并方差估计。默认的备择假设是双侧的(即均值不相等,但大小的方向不确定)。你可以添加一个参数alternative="less"或alternative="greater"来进行有方向的检验。

结果解读:得到结果中P值小于0.05,说明要拒绝原假设(两品种v1值无差异),接受备择假设,即两品种v1值差异显著。

非独立样本的t检验假定组间的差异呈正态分布。

个人理解的应用实例:一个玉米品种接受两个施氮处理,两个施氮处理下玉米的产量是否存在差异。

t.test(y1, y2, paired=TRUE)

其中的y1和y2为两个非独立组的数值向量。

结果解读:不同氮素水平的比较显示p值小于0.05,说明v1值在两个氮水平间差异显著;而两个年份下v1值无显著差异。

如果想在多于两个的组之间进行比较,应该怎么做?如果能够假设数据是从正态总体中独立抽样而得的,那么你可以使用方差分析(ANOVA)。ANOVA是一套覆盖了许多实验设计和准实验设计的综合方法。

参考资料: