R语言期末试题【二期补充】-重庆工商大学-统计学课程

1、编写函数计算 1 1 + 2 2 + ⋯ + n n 1^{1}+2^{2}+\cdots+n^{n} 11+22++nn

#####第一题############
fun1 = function(n){
  s = 0 
  for (i in 0:n) {
    s = s + i^i
  }
  message('前n项目和为:',s)
}
fun1(2,4) # 调用函数	

2、编写函数计算1到50的和,分别用for循环和while循环

######第二题###############
## for 循环
fun2 = function(n){
  s = 0 # 这里设为1来装连乘
  for (i in 1:n) {
    s =  s+i
  }
  message('最后和为:',s)
}
fun2(50)

###########分割线###############################

## while 仅此条件不同而已
fun3 = function(n){
  s = 0
  i = 1
  while (i<=n) {
    s = s + i
    i =i + 1 # 需要更新变量
  }
  message('最后和为:',s)
}
fun3(50)

3、用循环函数求出1-100之间能被3和5整除的数的和,并输出结果。

######第三题########### 
k = 100
a = c()
for (i in 1:k) {
  if(i%%3==0 & i%%5==0){
    a = c(a,i)
  }

}
message('能被3和5整除的数:')
print(a)
message('和为:',sum(a))

4、(1)读入文件4.txt中的数据,建立y关于x1 x2 x3 x4的线性回归方程。(2)采用逐步回归法建立y关于x1 x2 x3 x4的线性回归方程,并对方程和回归系数进行显著性检验。

此题不想做,参照前一篇博文

5、编写函数,计算给定任意两个维度相同的一维数组,计算它们之间的欧氏距离。

#########第五题##############
# 先产生两个相同维度的向量
a = c(20,1,56,12,5)
b = c(12,23,45,1,4)
fun5 = function(a,b){
# 先判断向量长度是否一致
  if(length(a)!=length(B)){
    print('向量长度不一致,请重新输入!')
  }else{
    dist_sum = 0
    for (i in 1:length(a)) {
      dist_sum = dist_sum + (a[i]-b[i])^2
    }
    dist_sum_ = sqrt(dist_sum)
  }
  print(dist_sum_)
}
fun5(a,b)

6、编写函数,对任一个空气污染指数AQI,将其转换成对应的等级,具体转换规则如下:

0-50为优; 51-100为良; 101-150为轻度污染; 151-200为中度污染; 201-300为重度污染;300以上为重度污染++。

fun4 = function(A){
  if(A<=50){
    print("优")
  } else if (A<=100) {
    print("中度污染")
  }else if (A<=150) {
    print("轻度污染")
  }else if (A<=200) {
    print("中度污染")
  }else if (A<=250) {
    print("重度污染")
  }else {
    print("重度污染++")
  }
}
fun4(60)

7、设x服从泊松分布,编写函数,任意给定x=k和参数λ的值,计算x=k的概率。

P ( X = k ) = λ k k ! e − λ , k = 0 , 1 , ⋯ P(X=k)=\frac{\lambda^{k}}{k !} e^{-\lambda}, k=0,1, \cdots P(X=k)=k!λkeλ,k=0,1,

fun5 = function(x,lambda){
  y = lambda^x/factorial(x)*exp(-lambda)
  return(y)
  # 返回概率值
}
fun5(1,1)
# 校验
dpois(1,1) # 验证自编函数是否算对了概率

8、用蒙特卡洛法计算的值。

∫ 3 8 x ln ⁡ x d x \int_{3}^{8} x \ln x d x 38xlnxdx

###########第八题################
# 基于蒙特卡洛求定积分的两种方法 
# 47.84837403474825
# 法1
decisionCondition = function(a){
  a[2]-a[1]*log(a[1])
}
# 用于判断在面积内的函数

n = 100000
x = runif(n,3,8)
y = runif(n,0,8*log(8))
A = cbind(x,y)
A
b = apply(A, 1, decisionCondition)
# length(which(b<0))
mean(b<=0)*5*(8*log(8))# 注意这里,将算出来的面积乘上总面积得到积分区域面积

# 法2
n=10000
x = runif(n,3,8)
mean(x*log(x))*5 # 乘以(b-a)

9、给定两组数,检验其均值等于某一常数(t检验)

H 0 : μ 1 = μ 2 v s H 1 : μ 1 ≠ μ 2 \boldsymbol{H}_{0}: \mu_{1}=\mu_{2} \quad \boldsymbol{v} \boldsymbol{s} \quad \boldsymbol{H}_{1}: \mu_{1} \neq \mu_{2} H0:μ1=μ2vsH1:μ1=μ2
检验统计量为:
t = x ˉ 1 − x ˉ 2 s pooled 1 n 1 + 1 n 2 ,  其中  s pooled = ( n 1 − 1 ) s 1 2 + ( n 2 − 1 ) s 2 2 n 1 + n 2 − 2 t=\frac{\bar{x}_{1}-\bar{x}_{2}}{s_{\text {pooled}} \sqrt{\frac{1}{n_{1}}+\frac{1}{n_{2}}}}, \text { 其中 } s_{\text {pooled}}=\sqrt{\frac{\left(n_{1}-1\right) s_{1}^{2}+\left(n_{2}-1\right) s_{2}^{2}}{n_{1}+n_{2}-2}} t=spooledn11+n21 xˉ1xˉ2, 其中 spooled=n1+n22(n11)s12+(n21)s22
拒绝域为 ∣ t ∣ > t α ( n 1 + n 2 − 2 ) |\boldsymbol{t}|>\boldsymbol{t}_{\alpha}\left(n_{1}+n_{2}-2\right) t>tα(n1+n22)
x 1 = c ( 5.5 , 6.3 , 5.1 , 7.8 , 10.2 , 6.8 , 5.3 ) x 2 = c ( 5.9 , 4.0 , 7.3 , 9.5 , 6.1 , 5.7 , 9.0 , 8.1 , 4.3 ) \begin{array}{l} x_{1}=\mathrm{c}(5.5,6.3,5.1,7.8,10.2,6.8,5.3) \\ x_{2}=\mathrm{c}(5.9,4.0,7.3,9.5,6.1,5.7,9.0,8.1,4.3) \end{array} x1=c(5.5,6.3,5.1,7.8,10.2,6.8,5.3)x2=c(5.9,4.0,7.3,9.5,6.1,5.7,9.0,8.1,4.3)

# 检验函数编写

# 法1 自写函数t.test检验函数
# 这里传入数据的列名为a,b
t_test_fun = function(A,B,alph=0.05){
  # 列数据作为计算对象
  a = A
  b = B
  # 1.计算基本量
  # 1.1向量a,b长度
  n1 = length(a)
  n2 = length(b)
  # 1.2计算a,b均值
  a_bar = mean(a)
  b_bar = mean(b)
  message('a组均值:',a_bar,'\n')
  message('b组均值:',b_bar,'\n')
  # 计算a,b方差
  var1 = var(a)
  var2 = var(b)
  message('a组方差:',var1,'\n')
  message('b组方差:',var2,'\n')
  # 求合并方差(方差齐性)
  concat_vars = (var1*(n1-1)+var2*(n2-1))/(n1+n2-2)
  message('联合方差为:',concat_vars,'\n')  
  # 计算t统计量
  t_statistic = (a_bar-b_bar)/sqrt(concat_vars*(1/n1+1/n2))
  message('t统计量为:',t_statistic,'\n')
  # 计算自由度
  v = (n1+n2-2)
  message('自由度为:',v,'\n')
  #t分布临界值
  t_value = qt(alph,v)
  if (abs(t_statistic) > abs(t_value)){
    print('拒绝原假设,两组数据之间存在显著性差异')
  }else{
    print('接受原假设,两组数据之间不存在显著性差异')
  }
}

# 产生随机数
A = c(5.5,6.3,5.1,7.8,10.2,6.8,5.3)
B = c(5.9,4.0,7.3,9.5,6.1,5.7,9.0,8.1,4.3)
# data1 = data.frame(a = A,b = B)
t_test_fun(A,B,alph = 0.05)

# 法2 验证
t.test(A,B,alternative = 'two.sided',
       conf.level = 0.95)