Matlab 版 (精华区)

发信人: zjliu (秋天的萝卜), 信区: Matlab
标  题: 13.用S作随机模拟计算
发信站: 哈工大紫丁香 (Sat Apr 24 13:42:24 2004), 站内信件

用S作随机模拟计算
作为统计工作者,我们除了可以用S迅速实现新的统计方法,还可以用S进行随机模拟。

随机模拟可以验证我们的算法、比较不同算法的的优缺点、发现改进统计方法的方向,

是进行统计研究的最有力的计算工具之一。

随机模拟最基本的需要是产生伪随机数,S中已提供了大多数常用分布的伪随机数函数,

可以返回一个伪随机数序列向量。这些伪随机数函数以字母r开头,比如rnorm()是正态

伪随机数函数,runif()是均匀分布伪随机数函数,其第一个自变量是伪随机数序列长度

n。关于这些函数可以参见第14节以及系统帮助文件。下例产生1000个标准正态伪随机数



> y <- rnorm(1000)                                                            
                                          

这些伪随机数函数也可以指定与分布有关的参数,比如下例产生1000个均值为150、标准

差为100的正态伪随机数:

> y <- rnorm(1000, mean=150, sd=100)                                          
                                          

产生伪随机数序列是不重复的,实际上,S在产生伪随机数时从一个种子出发,不断迭代

更新种子,所以产生若干随机数后内部的随机数种子就已经改变了。有时我们需要模拟

结果是可重复的,这只要我们保存当前的随机数种子,然后在每次产生伪随机数序列之

前把随机数种子置为保存值即可:

> the.seed <- .Random.seed                                                    
                                          
> ……………                                                                  
                                          
> .Random.seed <- the.seed                                                    
                                          
>  y <- rnorm(1000)                                                           
                                          

作为例子,我们来产生服从一个简单的线性回归的数据。

# 简单线性回归的模拟
lm.simu <- function(n){
    # 先生成自变量。假设自变量x的取值范围在150到180之间,大致服从正态分布。
    x <- rnorm(n, mean=165, sd=7.5)
    # 再生成模型误差。假设服从N(0, 1.2)分布
    eps <- rnorm(n, 0, 1.2)
    # 用模型生成因变量
    y <- 0.8 * x + eps
    return(data.frame(y,x))
}

S没有提供多元随机变量的模拟程序,这里给出一个进行三元正态随机变量模拟的例子。

假设要三元正态随机向量 的 n个独立观测,可以先产生n个服从三元标准正态分布的观

测,放在一个 n行3列的矩阵中:

U <- matrix(rnorm(3*n), ncol=3, byrow=T)

可以认为矩阵U的每一行是一个标准的三元正态分布的观测。设矩阵
的Choleski分解为 , A为上三角矩阵,若随机向量 ,则 。因此,
作为一个三行 n列的矩阵每一行都是服从 分布的,且各行之间独立。经过转置,产生的

 X

X <- matrix(rep(mu,n), ncol=3, byrow=T) + U %*% A

是一个 n行三列的矩阵。

有时模拟需要的计算量很大,多的时候甚至要计算几天的时间。对于这种问题我们要善

于把问题拆分成可以单独计算的小问题,然后单独计算每个小问题,把结果保存在S对象

中或文本文件中,最后综合保存的结果得到最终结果。

如果某一个问题需要的计算时间比较长,我们在编程时可以采用以下的技巧:每隔一定

时间就显示一下任务的进度,以免计算已经出错或进入死循环还不知道;应该把中间结

,对这种记录方法提供了支持),如果需要中断程序,中间结果可能是有用的,有些情

况下还可以根据记录的中间结果从程序中断的地方继续执行。
 

--
╔═══════════════════╗
║★★★★★友谊第一  比赛第二★★★★★║
╚═══════════════════╝

※ 来源:.哈工大紫丁香 bbs.hit.edu.cn [FROM: 202.118.229.162]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:5.654毫秒