dengyishuo
我有一点还在惶惑,中心极限定律和大数定律一直都是放在一起讲的,那么中心极限定律和大数定律又是什么关系呢,期待有人讲一讲。
邱怡轩
[未知用户] 大数定律只是一个点的性质,而中心极限定理是分布的性质,后者比前者更深刻。
dengyishuo
[未知用户] 那么把它们连接起来的桥梁是什么?
easttiger-easttiger
[未知用户] 我觉得粗糙地理解的话可以认为CLT蕴含LLN. CLT给的是sample mean的极限分布, 并且方差趋向于0. LLN给的是sample mean的收敛极限. 那既然方差收敛于0了, 那粗略的看应该就是随机变量按概率收敛到一个点了.
胡江堂
益辉,那段模拟二项分布的SAS代码,最后缺了结束宏的%mend;。说代码的简洁,其实,这段宏编译之后,%a(n)就可以当作函数用,n是唯一的参数,这就可以相当于附上的R代码a = function(n) hist(rbinom(n, n, 0.8))——这段R代码里面的几个函数,也是背后编译好的。正文的那段比较,可能有失公平。
SAS的data steps脱胎于以前的大机语言PL/I,有明显的过程式编程风格(C、非OOP的C++等等),而R是向量式的编程语言,个人认为,对传统的程序员来讲,SAS会更亲切,R则是让统计学家感到舒服的语言。
eijuhz-eijuhz
[未知用户] 江堂兄指出了要害:
SAS中的宏=R中已有的函数
其实从简洁性的角度来说是差不多的。
大家喜欢SAS就用SAS,喜欢R就用R.
我个人的观点还是:找工作用SAS,搞研究用R
yihui
[未知用户] %a(n)确实可以当做rbinom(n,n,0.8)来用,但生成n个随机数是统计模拟中最常见的功能,如果在庞大的SAS中还需要一个个生成,那未免也太悲剧了。这个比较并非针对功能问题——长短代码都可以实现类似的功能,而是(统计)程序员的工作量。
%mend;已经加上,谢谢。
胡江堂
[未知用户] 我的R只是"hello world"的水平,先说说看。文中SAS的随机数生成函数ranbin(),与R函数rbinom()类似——SAS也不需要“一个个生成”随机数,而那段宏大致与hist(rbinom())相当。
区别在于,R用hist()生成直方图,而SAS需要用一个proc univariate来实现。
yihui
[未知用户] 这个等号要换成约等号。如江堂所说,SAS的编程风格是过程式的,把一个工作的流程一起写完然后一起提交代码,顺序执行,这是宏(或批处理)的特征,表面看起来宏确实挺像函数,但有个本质的区别就是函数可以“批处理”一些事情,它还能返回值,而宏最多只能创造一些全局变量供后面的过程使用。
在注4的SAS代码中,画直方图只能根据全局的数据rv来做,宏只能这样:
%a(100);
proc univariate data=rv noprint;
而不能直接把数据传给需要它的地方,如
proc univariate data=%a(100) noprint;
用宏写一段小程序没问题,如果是大型开发,而程序语言不支持函数,程序员肯定会疯掉。当然,SAS在问世三十多年后,现在终于可以支持函数了。
xin-comeandgo_2007
[未知用户] 益辉说SAS"不能”把“把数据传给需要它的地方”, 看来你对这段宏的理解还欠火候, 让小的斗胆来评论一下:
proc univariate data=rv noprint; 里面的rv, 表面看来是一个固定的数据, 但是他的内容是由%a(n)里的n (也就是这个SAS 函数/宏的唯一参数)来决定的, n=100, rv 就是一个长度为100 的vector, n=1000, rv就是一个长度为1000的vector, 这个rv就是%a(n)的唯一输出变量, 也就是益辉所说的返还值。
那么宏和函数的差别到底在那里呢? 宏的本质是文本替代, 换句话说, 如果用一个%do 1=1 %to 100的 循环来运行这个%a(n), cpu在编译的时候其实是实际上产生了100X的代码, 然后执行。 但是函数是抽象的, 编译好了之后也只有一段code, 但是CPU要把这一段code动态运行100次。 所以对CPU来说宏和函数的差别是本质的。 但是对于终用户来说, 都有输入参数和返回值, 宏和函数的功能是很相似的。
由于宏的历史比较悠久了, 现在嘲笑宏好像也是很时髦的事情。但是应该承认宏在现代计算语言中还是有一席之地的。 C就是支持宏的, JAVA不支持宏也时常为人诟病。 有兴趣的还可以看一看ROSS IHAKA的一个讲座:
http://www.stat.auckland.ac.nz/~ihaka/downloads/Singapore-2008.pdf
IHAKA最近在研究超越R的下一代统计平台, 在里面宏的重要性几乎是和函数并立的。
xin-comeandgo_2007
[未知用户] 其实SAS “一个一个”生成随机数, 这个说法是没错的。
binom1 = ranbin(_seed_,&n,0.8); CPU产生随机数, 下面的OUTPUT是把该记录写入硬盘。sas的工作模式是从硬盘读一条记录, 在CPU/RAM操作之, 然后将其写回硬盘, R则是讲整个object读入内存, SAS这个特点是他在操作大数据方面很有优点, 但是代价是整个过程是 data centric, 逻辑比较不直观。 这里又不能不提到 Ross Ihaka的另一片雄文了。
http://www.stat.auckland.ac.nz/~ihaka/downloads/Compstat-2008.pdf
在里面他提到SAS这种“one record at a time" 也要被整合到他的所谓下一代计算语言中了.......
胡江堂
[未知用户] to xin,
你是对的,ranbin()产生一个随机数,n个循环则产生n个随机数。我提到SAS不需要“一个个生成”随机数,是认为“一个个”这个字眼显得太手工,循环很方便完成这个任务,而循环如果不是明显写出来的,就是暗含在里面的。
yihui
[未知用户] 所以说向量化编程可以减轻统计工作者的编程任务啊,R把这些常见的功能都封装到底层语言中,代码写起来既轻巧又不失效率
Alucard
中间的gif演示建议把纵轴min-max固定
yihui
[未知用户] 谢谢,这个建议很好,固定坐标轴范围之后可以明显观察到:样本均值的分布越来越集中于一个点,即:x轴越来越窄,y轴越来越高。这是自然而然的结果,因为最终样本均值会以概率收敛到一个点(总体均值)。
这里面有个问题就是,y轴的范围要画完图之后才能确定,事前没法确定,虽然也不是太麻烦(用hist()事先计算一下就可以),但我不太想增加代码了……
范建宁
[未知用户] 中心极限定理没有错,但是样本量为2的时候话中心极限定理,这是没有真正理解“极限”的含义。
garyxu
你好,想要做CLT的一个仿真gif图,通过google找到这来了。刚刚开始学2天R,问的问题可能比较菜,见谅!
clt.ani里面似乎只能做独立同分布随机变量的演示,如果随机变量本身属于不同的分布,或者分布类型相同,但方差等不同该怎么做?还有是不是只能做一些常用分布的演示,如果我已知了分布的表达式想要做演示该怎么做?
我再把我的问题说具体些:有一系列相位随机的正弦运动,每个运动的幅值当作一个随机变量,想演示这样的n个随机变量的和的分布随n增加的演变过程
yihui
[未知用户] 你说得对,clt.ani()只能做独立同分布的演示。如果你已知了分布的表达式,那么下一步需要知道的是如何从那个分布中随机抽样,就像rexp()从指数分布中抽样、runif()从均匀分布中抽样一样。
我不太了解你说的正弦运动,你说的随机变量是振幅?(我不知道幅值是什么)随机变量的分布是什么?
garyxu
[未知用户] 问问题果然不那么容易,还是没问清
那么如何从一个已知表达的分布中抽样呢?我搜索不到相关的资料,对rexp()这类函数的介绍只有如何用它,而没有函数原理的说明。
y =A*sin(t) t是一个均匀分布的随机变量,A是系数,我要演示的就是N个y的和的分布情况。运到的问题是:
1.这样表达式所表示的y取值的分布不是常用的分布,不能直接用rexp() runif()这样的函数进行抽样
2.每个分布的类型相同,但是方差是不同的
yihui
[未知用户] 我不知道均匀分布的随机变量在取了sin()之后是什么分布。这里如果A是常数,那么CLT的演示是没有问题的,如:
library(animation)
A = 1
ani.options(interval = 0.2, nmax = 100)
par(mar = c(4, 4, 1, 0.5),
mgp = c(1.5, 0.5, 0))
clt.ani(FUN = function(n) A*sin(runif(n)),
mean = NULL)