第五章 R数学计算与统计模拟
统计模拟
11
Monte Carlo方法简史
2、1930年,Enrico Fermi利用Monte Carlo方法研究中 子的扩散,并设计了一个Monte Carlo机械装臵, Fermiac,用于计算核反应堆的临界状态 3、Von Neumann是Monte Carlo方法的正式奠基者,他与 Stanislaw Ulam合作建立了概率密度函数、反累积分布 函数的数学基础,以及伪随机数产生器。在这些工作中 ,Stanislaw Ulam意识到了数字计算机的重要性
合作起源于Manhattan工程:利用 ENIAC(Electronic Numerical Integrator and Computer)计算产额 Nhomakorabea
4、随着计算机和统计技术的快速发展,Monte Carlo方 法不断丰富、应用也越来越广泛
13
Monte Carlo模拟的应用:
自然现象的模拟: 宇宙射线在地球大气中的传输过程; 高能物理实验中的核相互作用过程; 实验探测器的模拟 数值分析: 利用Monte Carlo方法求积分 金融工程: 股票期权的模拟定价 离散事件的模拟 ……
例子: >3+5 >3-5 >3/5 >3^5 >x=5 >?plot >help(plot)
32
向量
向量是R中最为基本的类型 一个向量中元素的类型必须相同,包括
统计模拟
主讲教师:刘洪伟 E-mail: liuhungwei@
1
目录
第一章 第二章 第三章 第四章 第五章 第六章 第七章 第八章
统计建模与R软件假设检验习题答案
04 习题答案解析
习题一答案解析
答案:D
解析:根据题目描述,A、B、C三个选项都是描述数据特征的,而D选项是描述数据来源的,与题目 要求的“数据特征”不符。
习题二答案解析
答案:B
解析:根据题目要求,需要选择一个假设检验的方法。A选项是参数检验,适用于总体分布已知的情况;B选项是非参数检验 ,适用于总体分布未知或不符合正态分布的情况;C选项是回归分析,用于研究变量之间的关系;D选项是聚类分析,用于数 据的分类。根据题目描述,由于总体分布未知且不符合正态分布,所以选择B选项。
模型评估
01
02
03
交叉验证
将数据集分成训练集和测 试集,使用训练集训练模 型,在测试集上评估模型 的性能。
均方误差
衡量预测值与实际值之间 的误差,越小越好。
准确率
衡量分类模型正确预测的 比例,越高越好。
02 R软件基础
R软件介绍
总结词
R软件是一种开源的统计计算和图形绘制软件,广泛应用于数据分析和统计建模 。
解析:根据题目要求,需要选择一个统计量 来描述数据的集中趋势。A选项是平均数, 是最常用的描述集中趋势的统计量;B选项 是中位数,描述数据的中位数位置;C选项 是众数,描述数据中出现次数最多的数;D 选项是标准差,描述数据的离散程度。根据
题目要求,选择A选项。
习题五答案解析
答案:C
解析:根据题目要求,需要选择一个统计量来检验两 个样本是否来自同一个总体。A选项是t检验,适用于 两个正态分布的总体;B选项是卡方检验,适用于分 类数据的比较;C选项是F检验,适用于两个总体方差 的比较;D选项是z检验,适用于总体比例的比较。根 据题目要求,选择C选项。
假设检验的优缺点
统计建模与R软件第五讲-(2017)PPT课件
sample estimates:
mean of x 241.5
问题重点: 平均寿命小于225是小
概率事件
拒绝域比显著性水平α小
第12页/共30页
二个正态总体的情况
双边: H0 : 1 u2, H1 : 1 u2 单边I: H0 : 1 u2, H1 : 1 u2 单边II:H0 : 1 u2, H1 : 1 u2
H0 : 0 225, H1 : 0 225
是否有理由认为元件的平均寿命小于225?
H0 : 0 225, H1 : 0 225
x=c(159,280,101,212,224,379,1 79,264,222,362,168,250,149, 260,485,170)
source('mean.test1.R') mean.test1(x,mu=225,side=1)
(H0)
X Bα/2
X B1-α/2
在理论上存在的若干个样本均值中,只要某个样本 均值Xi>X Bα/2时, 我们将误认为H0为真,也就是不拒绝H0。
由于真实情况是H1为真(H0为假),这样我们就犯了β错误,即纳伪的错误。
犯β错误的概率大小就是相对真实情况H1(正态曲线A)而言,图1中阴影部分的面积:
X 0 ~t(n 1)
正
2 未知时: S / n
态
总
拒绝域: | T | t/2(n 1)
体
的
情
单
况
边
H0 : u0,H1: u0
Z X 0 ~N (0,1)
2 已知时:
/ n
拒绝域: Z Z (orZ Z )
(orH0 : u0, H1 : u0)
X 0 ~t(n 1)
r软件 实训内容
r软件实训内容
R软件是一种用于统计计算和可视化的编程语言和软件环境。
以下是一些可能的R软件实训内容:
1. R语言基础:学习R语言的语法、变量、数据结构、控制流、函数等基础知识。
2. 数据导入和整理:学习如何从各种数据源导入数据到R中,并掌握数据清洗、数据转换和数据重塑等技术。
3. 数据可视化:学习如何使用R中的各种可视化包(如ggplot2、lattice 等)创建各种图表和图形,以更好地理解数据。
4. 统计分析:学习如何使用R进行各种统计分析,如描述性统计、参数检验、非参数检验、回归分析、方差分析等。
5. 机器学习和数据挖掘:学习如何使用R中的各种机器学习包(如caret、randomForest、e1071等)进行数据挖掘和机器学习。
6. 实践项目:通过实际项目,将所学的R知识和技能应用到实际问题中,提高解决实际问题的能力。
以上是一些常见的R软件实训内容,具体实训内容可能会根据课程要求和实际需求而有所不同。
R语言统计模拟
只要产生服从(0,1)均匀分布的随机变量x,然后用g作用一下,
再就平均值就可以了
o > integ <- function(h, a, b, n){ x <- runif(n); sum((b-a)*h(a+(b-a)*x))/n; }
例如要求 2 exx2 dx, 利用上述integ函数求解, 2
例如要求 exdx,利用上述integ函数求解, 0
只需要令h(x) ex
• > h <- function(x){ exp(-x);}
• > integ(h, 10000);
o 随机模拟最基本的需要是产生伪随机数,R中已提供了大多数 常用分布的伪随机数函数,可以返回一个伪随机数序列向量。
o 产生伪随机数序列是不重复的,实际上,R在产生伪随机数时从 一个种子出发,不断迭代更新种子,所以产生若干随机数后内部 的随机数种子就已经改变了。有时我们需要模拟结果是可重复的, 这只要我们保存当前的随机数种子,然后在每次产生伪随机数序 列之前把随机数种子置为保存值即可:
随机模拟的基本思想:假设我们有个区域R大小已知,在这个 区域中有一个不规则的区域M(其面积不能通过公式直接计算),请 问如何求M的面积?
R M
方法: Ø1) 把这个不规则的区域M划分成很多个小小的规则的区域,用规则小区域的面积总 和来近似逼近M的面积; Ø2) 抓一把黄豆,均匀地铺在R上,数一数R里面的黄豆数,记为S。再数一数M里的黄 豆数,记为S1,则M的近似面积为S1/S。----这就是采样的方法。
另一种求定积分的方法
根据大数定律:1
n
n i 1
g(Xi)
E(g(X
))
1
b h(t)dt
统计建模与R语言PPT课件
+
sub = G == i)
+ res.mat[i, ] <- residuals(gene.aov)
+ coef.mat[i, ] <- coef(gene.aov)
+}
或
>for(i in 1:1522)
7 3 7 10
第4页/共23页
• 向量的下标(index)与向量子集(元素)的提取 • 正的下标 提取向量中对应的元素 • 负的下标 去掉向量中对应的元素 • 逻辑运算 提出向量中元素的值满足条件的元素 注:R中向量的下标从1开始,这与通常的统计或数学软件一致而象C语言等 计算机高级语言的向量下标则从0开始!
> coef.mat = matrix(0, 1522, 4, byrow = TRUE)
> for(i in 1:1522) {
+ gene.aov = aov(Intensity ~ A + T + A * T,
+
sub = G == i)
+
res.mat[i, ] = residuals(gene.aov) # 保存ANOVA分
> ybar = data.frame(A = factor(a), G = factor(g),
+
T = factor(t), Intensity = y)
> attach(ybar)
> ybar[1:10,] # 查看ybar的前10行
> res.mat = matrix(0, 1522, 8, byrow = TRUE)
>x=c(42,7,64,9)
>length(x)
基于R软件的统计模拟ppt课件
火车离站时刻 概率 13:00 0.7 13:05 0.2 13:10 0.1
表2:某人到达B站的时刻及概率
人到站时刻 概率 13:28 0.3 13:30 0.4 13:32 0.2 1分析—— 这个问题用概率论的方法求解十分困难, 它涉及此人到达时刻、火车离开站的时刻、火 车运行时间几个随机变量,而且火车运行时间 是服从正态分布的随机变量,没有有效的解析 方法来进行概率计算。在这种情况下可以用计 算机模拟的方法来解决。
实际问题 统计、逻辑 模型 计算机模拟(程序、算法) 实际解 统计、计算机解
一、统计模拟的基本概念
(二)统计模拟方法
一般地,统计模拟分类如下: 若按状态变量的变化性质分为连续随机模拟和离散 随机模拟。 而按变量是否随时间变化又可分为动态随机模拟和 静态随机模拟。 常用的统计模拟方法主要有以下几种: 1.蒙特卡罗法 2.系统模拟方法 3.其它方法:包括Bootstrap(自助法)、MCMC (马氏链蒙特卡罗法)等。
k 作为此人能赶上 n 火车的概率p 的近似估计;
成立次数k=k+1
成立次数不变
试验次数 是否达到n次 是 计算估计结果 k/n
否
⑤当n 时,以
进入演示
windows(7, 3) prb = replicate(100, {
#括号内程序重复100次
x = sample(c(0, 5, 10), 1, prob = c(0.7, 0.2, 0.1)) y = sample(c(28, 30, 32, 34), 1, prob = c(0.3, 0.4, 0.2, 0.1)) plot(0:40, rep(1, 41), type = "n", xlab = "time", ylab = "", axes = FALSE) axis(1, 0:40) r = rnorm(1, 30, 2) points(x, 1, pch = 15) i=0 while (i <= r) { i=i+1 segments(x, 1, x + i, 1) if (x + i >= y) points(y, 1, pch = 19) Sys.sleep(0.1) } points(y, 1, pch = 19) title(ifelse(x + r <= y, "poor... missed the train!", "Bingo! catched the train!")) Sys.sleep(4) 进入模拟 x+r>y }) mean(prb)
R语言入门 S统计模拟
实验目的
学习如何应用R软件进行简单统计模拟
Hale Waihona Puke 实验内容1、统计模拟简介 2、应用实例
• 用S作随机模拟计算 作为统计工作者,我们除了可以用S迅速实 现新的统计方法,还可以用S进行随机模拟。 随机模拟可以验证我们的算法、比较不同 算法的优缺点、发现改进统计方法的方向, 是进行统计研究的最有力的计算工具之一。
• 最后,我们可能需要一个比较正规的正态性检 验方法。 • R提供了Shapiro-Wilk 检验 • shapiro.test(long) • 和Kolmogorov-Smirnov 检验 • ks.test(long, "pnorm", mean = mean(long), sd = sqrt(var(long))) • 注意一般的统计分布理论(distribution theory) 在这里可能无效,因为我们用同样的样本对正 态分布的参数进行估计的。
2、数学模拟
在一定的假设条件下,运用数学运算模拟系统 的运行,称为数学模拟。现代的数学模拟都是在 计算机上进行的,称为计算机模拟。 计算机模拟可以反复进行,改变系统的结构和系 数都比较容易。 在实际问题中,面对一些带随机因素的复杂系 统,用分析方法建模常常需要作许多简化假设, 与面临的实际问题可能相差甚远,以致解答根本 无法应用。这时,计算机模拟几乎成为唯一的选 择。
随机模拟计算的思路:
[1] 针对实际问题建立一个简单且便于实现的概率 统计模型,使所求的解恰好是所建模型的概率分布 或某个数字特征,比如,是某个事件的概率或该模 型的期望值; [2] 对模型中的随机变量建立抽样方法,在计算机 上进行模拟试验,抽取足够的随机数,并对有关的 事件进行统计; [3] 对模拟试验结果加以分析,给出所求解的估计 及其精度(方差)的估计; [4] 必要时,还应改进模型以降低估计方差和减少 试验费用,提高模拟计算的效率。
统计建模与R软件课后答案
第二章2.1> x<-c(1,2,3);y<-c(4,5,6)> e<-c(1,1,1)> z<-2*x+y+e;z[1] 7 10 13> z1<-crossprod(x,y);z1[,1][1,] 32> z2<-outer(x,y);z2[,1] [,2] [,3][1,] 4 5 6[2,] 8 10 12[3,] 12 15 182.2(1)> A<-matrix(1:20,nrow=4);B<-matrix(1:20,nrow=4,byrow=T) > C<-A+B;C(2)> D<-A%*%B;D(3)> E<-A*B;E(4)> F<-A[1:3,1:3](5)> G<-B[,-3]> x<-c(rep(1,5),rep(2,3),rep(3,4),rep(4,2));x2.4> H<-matrix(nrow=5,ncol=5)> for (i in 1:5)+ for(j in 1:5)+ H[i,j]<-1/(i+j-1)(1)> det(H)(2)> solve(H)(3)> eigen(H)2.5> studentdata<-data.frame(姓名=c('张三','李四','王五','赵六','丁一')+ ,性别=c('女','男','女','男','女'),年龄=c('14','15','16','14','15'),+ 身高=c('156','165','157','162','159'),体重=c('42','49','41.5','52','45.5')) 2.6> write.table(studentdata,file='student.txt')> write.csv(studentdata,file='student.csv')2.7count<-function(n){if (n<=0)print('要求输入一个正整数')repeat{if (n%%2==0)n<-n/2elsen<-(3*n+1)if(n==1)break}print('运算成功')}}第三章3.1首先将数据录入为x。
统计模拟与R第2讲
或者用
>X=rep(0,100)
X=sample(c(1,2,3,4),100,
> for(i in 1:100)
c(0.2,0.15,0.3,0.35),replace=TRUE)
{u=runif(1);if(u<0.2){X[i]=1}
else if(u<0.35){X[i]=2}
else if(u<0.65){X[i]=3}else X[i]=4}
2.令k=n 3.生成随机数U,并设I=Int(kU)+1 4.交换PI , Pk 5.令k=k-1,若k>1,则转至步骤3. 6. P1, , Pk 为所求排列.
R程序:
pf=function(n){ X=sample(n);k=n while(k>1){ u=runif(1);I=floor(k*u)+1 V=X[k];X[k]=X[I];X[I]=V;k=k-1 }
>X
[1] 3 2 3 3 1 2 4 2 3 3 1 1 1 4 3 4 1 1 4 4 4 3 4 3 2 2 3 4 4 3 4 4 1 4 1 1
[37] 3 3 4 4 2 3 1 3 4 4 3 4 3 4 3 3 1 4 1 4 4 3 3 3 4 4 3 2 1 4 2 3 2 4 2 4
1
(2 e)2
Step5:转向Step3
R程序:
rp=function(n,lambda){ Y=rep(0,n) for(j in 1:n){ i=0;p=exp(-lambda);F=p u=runif(1) while(F<=u){ p=lambda*p/(i+1);F=F+p i=i+1 }
统计建模与R软件课后答案
第二章2.1> x<-c(1,2,3);y<-c(4,5,6)> e<-c(1,1,1)> z<-2*x+y+e;z[1] 7 10 13> z1<-crossprod(x,y);z1[,1][1,] 32> z2<-outer(x,y);z2[,1] [,2] [,3][1,] 4 5 6[2,] 8 10 12[3,] 12 15 182.2(1) > A<-matrix(1:20,nrow=4);B<-matrix(1:20,nrow=4,byrow=T) > C<-A+B;C(2)> D<-A%*%B;D(3)> E<-A*B;E(4)> F<-A[1:3,1:3](5)> G<-B[,-3]2.3> x<-c(rep(1,5),rep(2,3),rep(3,4),rep(4,2));x2.4> H<-matrix(nrow=5,ncol=5)> for (i in 1:5)+ for(j in 1:5)+ H[i,j]<-1/(i+j-1)(1)> det(H)(2)> solve(H)(3)> eigen(H)2.5> studentdata<-data.frame(姓名=c('张三','李四','王五','赵六','丁一') + ,性别=c('女','男','女','男','女'),年龄=c('14','15','16','14','15'),+ 身高=c('156','165','157','162','159'),体重=c('42','49','41.5','52','45.5')) 2.6> write.table(studentdata,file='student.txt')> write.csv(studentdata,file='student.csv')2.7count<-function(n){if (n<=0)print('要求输入一个正整数')else{repeat{if (n%%2==0)n<-n/2elsen<-(3*n+1)if(n==1)break}print('运算成功')}}第三章3.1首先将数据录入为x。
统计与模拟R
•Kurt Hornik, R FAQ, Version 1.8-1, 2003-10-07 – B. D. Ripley, R for Windows FAQ, Version for rw1080 – R Html Help, Statistical Data Analysis 其它PDF/HTML文件: – Kickstarting R, /doc/contrib/ Lemonkickstart/ – R examples, Alison Gibbs, /alis ong/Teaching/ Winter04/Sta248/Rex.html
R的无私奉献者
Ross Ihaka
Robert Gentleman
Bill Venables
• R免费 • R 资源公开(不是黑盒子,也不是吝啬鬼) • R可以在UNIX, Windows和Macintosh运 行. • R 有优秀的内在帮助系统. • R有优秀的画图功能 • 学生能够轻松地转到商业支持的 S-Plus程序 (如果需要使用商业软件) • R语言有一个强大的,容易学习的语法,有许多内 在的统计函数.
2、逻辑向量 向量可以取逻辑值,如 >l=c(TRUE,TRUE,FALSE) >x=c(1,4,6.25) >l<-x>3 >l [1]FALSE TRUE TRUE 两个向量也可比较 >log(10*x) [1] 2.302585 3.688879 4.135167 >log(10*x)>x [1] TRUE FALSE FALSE 比较运算符:<,<=,>,>=,==(相等),!=(不等) 逻辑向量可以进行与(&)[表示同时满足],或(|)[两者之 一]运算.
R软件实战统计计算篇
• • • • • • • • • •
n <- 20 alpha <- .05 UCL <- replicate(1000, expr = { x <- rnorm(n, mean = 0, sd = 2) (n-1) * var(x) / qchisq(alpha, df = n-1) }) ind<-ucls>4 cov.rate<-cumsum(ind)/1:m plot(2:m,cov.rate[-1],type="l") abline(h=0.95)
例:
求服 3 )
命令:p=dbinom(x,n,p)
输入以下命令:
dbinom(0,8,1/3) dbinom(1,8,1/3)
x=0:8; y=dbinom(x,8,1/3) y 结果:
ans = 0.0390 ans = 0.1561 y = 0.0390 0.1561 0.2731 0.2731 0.0171 0.0024 0.0002 0.1707 0.0683
二、蒙特卡罗方法
1、蒙特卡罗积分
2、统计推断中的蒙特卡罗方法
1.估计
2.计算估计量的MSE
例:正态分布总体样本中位数的 MSE
作业:标准正态总体样本均值的 MSE
3.置信区间的估计
• • • • • • • • • • • • • •
n <- 20 alpha <- .05 x <- rnorm(n, mean=0, sd=2) UCL <- (n-1) * var(x) / qchisq(alpha, df=n-1) m<-100000 ucls<-numeric(m) for(i in 1:m){ x <- rnorm(n, mean=0, sd=2) ucls[i] <- (n-1) * var(x) / qchisq(alpha, df=n-1) } ind<-ucls>4 cov.rate<-cumsum(ind)/1:m plot(2:m,cov.rate[-1],type="l") abline(h=0.95)
统计计算与R填空题题库及答案(可编辑修改word版)
第二章R 软件的使用1.求解非线性方程组一般用Newton 法。
Newton 法的迭代格式为:其中J(x)为函数f(x)的Jacobi 矩阵。
请补全下列程序:Newtons = function (fun, x, ep=1e-5, it_max=100){index = 0; k = 1while (k<=it_max){x1 = x; obj = fun(x);x = x - (obj$J, obj$f);norm = sqrt((x-x1) %*% (x-x1))if (norm<ep){index = 1;}k = k+1}obj = fun(x);list(root= , it= , index=index, FunVal= )}funs = function(x){f = c(x[1]^2+x[2]^2-5, (x[1]+1)*x[2]-(3*x[1]+1))J = matrix(c(2*x[1], 2*x[2], x[2]-3, x[1]+1),nrow=2, byrow=T)list(f=f, J=J)}2.编写一个R 程序(函数).输入一个整数n,如果n 0 ,则中止运算,并输出一句话:“要求输入一个正整数”; 否则,如果n 是偶数,则将n 除以2,并赋给n;否则,将3 n +1 赋给n.不断循环,只到n = 1,才停止计算,并输出一句话:“运算成功”.这个例子是为了检验数论中的一个简单的定理. 请补全下列程序:fn =function(n){ if(n<=0)list(fail="要求输入一个正整数")else{i=0;{if(n 2==0)n =n = (3*n+1)if(n==1) breaki=i+1}(result="运算成功", n=n, iter=i)}}## 运行得到如下结果:fn(1)$result[1] "运算成功"$n[1] 1$iter[1] 2第三章数据描述性分析3.data_outline.R 计算样本的各种描述性统计量。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第五章R数学计算与统计模拟随着计算机技术的发展,统计模拟越来越得到重视。
R内置很多数学函数和统计分布函数,下面介绍这些函数及其应用以及如何编写简单的模拟实验。
一、随机抽样和数学计算(一)随机抽样在R中sample()函数可以用来产生随机排列或随机样本。
1.等可能不放回的随机抽样sample(x,n)其中,x为要抽取的向量,n为样本容量。
例如,从100个人中不放回地随机抽取10人的代码为:sample(1:100,10)如果要重复做抽样,并且抽样结果一样,可以设置随机种子:set.seed(10)设置种子的数字可以是任意的,只要固定、结果就一样。
2.等可能有放回的随机抽样sample(x,n,replace=TURE)其中选项replace=TURE表示抽样是有放回的,如果省略或为replace=FALSE表示抽样是不放回的。
例如,抛一枚硬币10次可以表示为:r<-sample(c("正","反"),10,replace = T)掷一颗骰子10次可以表示为:r<-sample(6,10,replace = T)注意,上面1:6简写为6。
3.不等可能的随机抽样sample(x,n,replace=TURE,prob=y)其中,prob=y用于指定x中元素出现的概率,向量y与x等长度。
例如,一名外科医生做手术成功的概率为0.9,那么他做10次手术成功的可能样本为:r<-sample(c("成功","失败"),10,replace = T,prob=c(0.9,0.1))R除了利用sample()函数产生进行随机抽样外,还可以利用随机分布函数产生多种不同分布下的随机数序列(见第二章)。
这些分布函数的形式为rfunc(n,p1,p2,…),其中func指概率分布函数,n为生成数据的个数,p1, p2,…是分布的参数数值。
例如,模拟生成1000个自由度为2的卡方分布随机数,再求其平均数:mean(rchisq(1000,df=2))(二)数学计算1.一般数学计算一般数学计算函数参见第二章。
1)计算概率求向量所有元素的和:sum(),求向量所有元素的积:prod()。
例如,从一副完全打乱的52张扑克中抽取4张,若不考虑顺序,则4张全为A的概率为:p<-1/choose(52,4)若考虑顺序,则4张依次为红心A、方块A、黑桃A和梅花A的概率为:p<-1/prod(52:49)求向量所有元素的累计和:cumsum(),返回一个等长向量。
求向量所有元素的累计积:cumprod(),返回一个等长向量。
2)计算最(极)值求参数中所有元素的最小值:min(),求参数中所有元素的最大值:max()。
z<-matrix(1:6)min(z[,1],z[,2])求参数中所有向量对应元素的最小值:pmin(),返回一个向量;求参数中所有向量对应元素的最大值:pmax(),返回一个向量。
z<-matrix(1:6)pmin(z[,1],z[,2])以上函数是求向量的最值,如果要求函数的最值需要使用nlm()、optimize()和optim()等函数。
例如,求函数f(x)=x2-sin(x)的最小值,如下所示:fx=function(x){x^2-sin(x)}nlm(fx,3)函数nlm()求极小值,这里用到了数值分析的一种近似求根方法——Newton-type方法,第二个参数是用来设定初始值的。
也可以使用optimize()对一元函数最优化:optimize(fx,c(0,1))上面,c(0,1)是设定求最优化的区间。
默认求最小值,若要求最大值可以设置maximum=T。
多元函数的最优化问题比一元函数的复杂。
例如,求函数f(x,y)=100(y-x2)2+(1-x)2的极小值,如下所示。
绘制三维函数图:fxy=function(x,y){100*(y-x^2)^2+(1-x)^2}x=seq(-10,20,0.5)y=xz=outer(x,y,fxy)persp(x,y,z,theta=-30,phi=30,ticktype="detailed")其中,x,y都是长度为61的数值向量,outer(x,y,fxy)传回一个61×61的数值矩阵。
利用optim()函数求最优化,需要重新设定函数,原因是optim()函数要求输入函数的自变量是向量而非标量。
fx=function(x){100*(x[1]-x[2]^2)^2+(1-x[2])^2}optim(c(-10,-10),fx)函数预设求极小值,添加参数control=list(fnscale=-1)进行极大化。
线性规划问题可以用包lpSolve中的函数lp()求解,如求下面问题的最优化:#target: max C = 5×x1 + 8×x2#subject to:#x1 + x2 <= 2#x1 + 2×x2 = 3#x1,x2 >=0R语言代码如下:library(lpSolve)eg.lp <- lp(objective.in=c(5, 8),const.mat=matrix(c(1, 1, 1, 2), nrow=2),const.rhs=c(2, 3),const.dir=c("<=", "="), direction="max")eg.lp$solutioneg.lp$objval3)非线性方程求解R提供了一元函数求根的函数uniroot():f=function(x){1-(1+x)^(-10)-6.71*x}plot(f,xlim=c(0.05,0.1))abline(h=0)x=uniroot(f,c(0.0001,1))x求解也可以化为最优化问题:g=function(x){f(x)^2}plot(g,xlim=c(0.05,0.1))optimize(g,c(0.0001,1))4)微积分R也可以进行微积分运算,包括符号微分和数值微分。
#求偏导数x <- 3; y <- 2.5; z <- 1exp1 <- expression(x / (y + exp(z)))exp1eval(exp1)D(exp1, "x")D(exp1, "y")D(exp1, "z")#求积分f<-function(x){x^2}integrate(f,0,1)另外,R的odesolve包也可以处理微分方程。
2.排序与配对1)排序对向量进行普通排序可以用sort()函数完成。
x<-c(1,5,3,2,8)sort(x)x注意,x本身没有改变。
要升序可加参数decreasing = FALSE。
如果想得到排序后的值在原向量中的索引,可以使用order()函数。
order(x)可以使用函数和索引对数据框进行排序。
v1<-c("f","m","f","f","m")#性别v2<-c(21,22,25,23,24)#年龄v<-cbind(v1,v2)r<-order(v2)rz<-v[r,]与排序相关的函数还有rank(),它返回向量中每一个元互的排位(rank)。
rank(x)注意rank()与order()的区别。
2)配对在d1和d2里有的是相同的记录,可以利用R的二元算子(binary operator)”%in%”找出。
”x%in%y”返回逻辑向量,表示在x中的元素是否也出现在y中。
1:7%in%5:105:10%in%1:7注意上面两条语句是不一样的。
如查找d1中和d2里名字相同的记录:d1[d1$姓名%in% d2$姓名,]在记录d中有重复记录,可以利用duplicated()函数找出。
v1<-c("f","m","f","f","m")#性别v2<-c(21,22,25,23,22)#年龄v<-cbind(v1,v2)duplicated(v)#后面与前面比较,返回逻辑向量v[duplicated(v),]3.向量和矩阵的计算1)一般运算向量乘以标量可以直接运算:x<-1:52*xR中有矩阵计算和处理的工具,函数rbind()和cbind()分别用上下或左右的方式合并向量或矩阵:m1 <- matrix(1, nr = 2, nc = 2)m2 <- matrix(2, nr = 2, nc = 2)rbind(m1, m2)数学意义上的两矩阵乘积的运算符是“%*%”,例如,对上面的矩阵m1和m2:m1%*%m2矩阵的转置由函数t()完成;这个函数也可以作用于数据框;函数det()可以用来求矩阵行列式的值;函数eigen()可以用来求矩阵的特征值和特征根;函数diag()可以用来提取或修正一个矩阵的对角元,或者创建一个对角矩阵。
函数sweep()可以做比较复杂的运算。
sweep(m1,1,c(1,2),"+")需要注意的是,diag()函数的再用性:如果它的参数是一个矩阵,它返回的是一个向量;反之亦然。
同样,如果它的参数是一个标量,那么这个函数返回指定大小的单位矩阵。
dm<-diag(m2)diag(dm)diag(3)x<-c(1,2,3,4,5)y<-c(2,4,6,8,10)2)内积和外积矩阵计算要区分内积和外积。
#内积也称点积x%*%y#或者crossprod(x,y)t(x)%*%y#外积、也称叉积x%o%y#或者outer(x,y)x%*%t(y)R中也有一些用于矩阵计算的专门的函数。
我们可以使用solve()求矩阵的逆,用qr()、chol()来分解矩阵,用svd()来做奇异值分解。
3)解线性方程组函数solve()还可以解线性方程组:#x1-x2=2#x1+x2=4a<-matrix(c(1,1,-1,1),2,2)b<-c(2,4)solve(a,b)4.集合运算R中包含一些方便的集合运算函数,主要有:集合x和y的并集:union(x,y);集合x和y的交集:intersect(x,y);集合x和y的差集:setdiff(x,y),即所有属于集合x但不属于集合y的元素组成的集合;检验集合x和y是否相等:setequal(x,y);检验元素c是否是集合x的元素:c%in%x;从含有n个元素的集合中选取含有k个元素的子集的数目:choose(n,k)。