统计计算在R中的应用(有相关习题例证)

一、分布函数及随机数在R中的基本操作及应用

1.用R语言的条件语句写出计算分布函数F(x)的值的程序代码。

#第一题(方法一)
fun=function(x,y=x){
 if(x<0){x-y}
 else if(x>=0&x<1){x}
 else {x-y+1}
}
fun(5) #括号内输入函数x的值,可计算出f(x)

运行结果如下:

方法二:

R代码为:

#第一题(方法二)
f=function(x){
  if(x>1){
    return(1)
  }
  else if(x<0){
    return(0)
  }
  else{
    return(x)
  }
}
f(x<-readline("请输入数据:"))
f(x<-readline("请输入数据:"))
f(x<-readline("请输入数据:"))
f(x<-readline("请输入数据:"))

运行结果如下:

2.在摇奖机中放入10个完全相同的球,分别标有数字1~10,每次启动摇奖机可以摇出一个球,

(1)将上述过程重复100次,用R模拟这个过程,将所有结果保存在名为result的向量中。

(2)对于i=1,2,...,10以及i=20,50,80,100,分别模拟10i次摇奖结果,计算数字3,6,9出现的频率。

解:

(1)R代码如下:

#第二题
#第一问
x<-sample(1:10,100,replace=T,prob=NULL)#获取随机数
result<-data.frame(x)#讲数据储存在result中

运行结果如下:

(2)运行代码如下:

#第二问
#i=1,2,...,10模拟10i次摇奖结果
for (i in 1:10){
  result1<-sample(1:10,10*i,replace=T)
  cat('3,6,9出现的频率依次为:','\n')
  p<-c(sum(result1==3)/length(result1),
       sum(result1==6)/length(result1),
       sum(result1==9)/length(result1))
  print(p)}
#i=20,50,80,100模拟10i次摇奖结果
x<-c(20,50,80,100)
for (i in x){
  result2<-sample(1:10,10*i,replace=T)
  cat('3,6,9出现的频率依次为:','\n')
  p<-c(sum(result2==3)/length(result2),
       sum(result2==6)/length(result2),
       sum(result2==9)/length(result2))
  print(p)}

运行结果如下:

二、离散型随机数的产生及应用R语言表述

1.甲乙两人下棋,每局中甲赢的概率为0.6,输的概率为0.2,平局的概率为0.2,则两人下8场棋,甲可能的胜负情况为?

解:

R代码如下:

result1<-sample(c("赢","平手","输"),8,replace=T, prob=c(0.6,0.2,0.2))
cat('赢,平手,输出现的频率如下:',result1)
p<-c(sum(result1=="赢")/length(result1),
     sum(result1=="平手")/length(result1),
     sum(result1=="输")/length(result1))
print(p) 

运行结果如下:

2.设有一决策系统,其中每个成员做出的决策互不影响,且每个成员作出正确决策的概率均为0.8。现由5个成员的决策系统,设作出正确决策的人数为X,试求出X的分布列及分布函数;若当占半数以上的成员作正确决策时,系统才能作出正确决策,求系统作出正确决策的概率。(要求作图:X的分布列,分布函数图,图上有标题,x轴,y轴的描述)

解:

R代码如下:

p_correct <- 0.8     #每个成员作出正确决策的概率为0.8
x <- 0:5  #5个成员作出决策共有6种可能,作出正确决策的人数0到5
dist_x <- dbinom(x, size = 5, prob = p_correct)   #计算X的分布列
dist_x
cdf_x <- pbinom(x, size = 5, prob = p_correct)   #计算X的分布函数
cdf_x
p_success <- sum(dist_x[(5/2+1):6])  
cat("系统作出正确决策的概率为:",p_success)
library(ggplot2)
df <- data.frame(X = x, P = dist_x, CDF = cdf_x)
# X的分布列
ggplot(df, aes(x = X, y = P)) + 
  geom_col(fill = "darkseagreen") +
  labs(title = "X的分布列",
       x = "作出正确决策的人数",
       y = "作出正确决策的概率")
# X的分布函数图
ggplot(df, aes(x = X, y = CDF)) + 
  geom_step() +
  labs(title = "X的分布函数图",
       x = "作出正确决策的人数",
       y = "作出正确决策的概率")

 运行结果如下:

3.由该商店过去的销售记录知道,某种商品每月的销售数可以用参数=10的泊松分布来描述,为了以95%以上的把握保证不脱销,问商店在月底至少应进某种商品多少件?(本例可进行验证,并作图:X的分布列,分布函数图,图上有标题,x轴,y轴的描述)

解:

R代码如下:

library(ggplot2)
lambda <- 10
prob <- 1 - ppois(0, lambda)   #计算不脱销的概率
cat("不脱销的概率为:", round(prob, 4), "\n")   #输出概率结果
min_sales <- qpois(0.95, lambda)    #计算不脱销的最小销售数
cat("商店在月底至少应进", min_sales, "件商品\n")  #输出最小销售数结果
x <- 0:20 # 假设最大销售数为20件
prob_x <- dpois(x, lambda)
# 绘制X的分布列图
ggplot() +
  geom_bar(aes(x = x, y = prob_x), stat = "identity", fill = "deeppink") +
  labs(title = "商品销售数分布列",
       x = "销售数", y = "不脱销的概率") +
  theme_minimal()

运行结果如下:

三、逆变换抽样法、舍选抽样法及合成法用R语言表述

1.试用变换抽样法、及舍选抽样法Ⅰ产生密度为p(x)= 8/9�2 ,x∈(0,1)的随机数,循环500次,要求给出两种算法的r程序。

解:

R代码如下:

#1.舍选抽样法
z<-integer(500)    #生成500个随机数
i=1
while(i<=500){
  U1<-runif(1,0,1)    #生成[0,1]之间的均匀分布随机数
  U2<-runif(1,0,1)
  X<-0+(1-0)*U1      #进行舍选抽样的候选随机数
  Y<-8/9*U2
  p<-8/9*(X**2)     #密度函数p(x)
  if(Y<=p){         #如果Y在[0,p(x)]之间,则接受该随机数
    z[i]=X;
    i=i+1}
}
z
#变换抽样法
z<-integer(500)    #生成500个随机数
for(i in 1:500){   #生成[0,1]之间的均匀分布随机数
    U<-runif(1,0,1)   #生成[0,1]之间的均匀分布随机数
    X<-sqrt(9/8*U)    #通过逆变换法得到符合p(x)的随机数
    z[i]<-X
    }
z

代码运行结果:

2.试用合成法产生密度函数为p(x)=(1+2x)/6,0<x<2的随机数。

R代码:

#第二题
z<-integer(500)    #生成500个随机数
for(i in 1:500){
  U1<-runif(1,0,1)    #将p(x)拆分为两个密度函数的线性组合,即p(x)=1/6+2x/6
  if(U1<1/6){
    X<-runif(1,0,1)
  }
  else{
    U2<-runif(1,0,1)
    X<-sqrt(6*U2)
    z[i] = X
  }
}
z

代码运行结果:

 

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JIA...Thriteen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值