百日筑基篇—— 统计函数简介二(R语言初识别九)

本文介绍了R语言中用于统计分析的函数,包括独立性检验如卡方检验、费舍尔精确检验和Mantel-Haenszel检验,以及相关性分析和绘图函数。文章还探讨了自定义函数的编写,强调了它们在提高效率中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

百日筑基篇—— 统计函数简介二(R语言初识别九)


前言

在上一章中,我简单介绍了一下有关统计的一些函数。而本章则紧跟上章,继续介绍统计函数。

一、独立性检验函数

独立性检验是统计学中的一种假设检验方法,用于评估两个或多个分类变量之间是否存在独立关系。
它的核心假设是两个变量之间没有关联或依赖关系。
在进行独立性检验时,我们需要设置一个显著性水平(通常是0.05),根据计算得到的检验统计量和p值,来决定是否拒绝原假设(即两个变量独立)。

1. 卡方检验

卡方检验是一种用于检验观察频数与期望频数之间是否存在显著差异的统计方法。它常用于比较不同组别或分类变量的分布是否独立,即判断是否存在关联或依赖关系。

mytable <-table(Arthritis$Treatment,Arthritis$Improved)
> mytable
         
          None Some Marked
  Placebo   29    7      7
  Treated   13    7     21


#使用chisq.test()函数进行卡方独立检验,
> chisq.test(mytable)

	Pearson's Chi-squared test

data:  mytable
X-squared = 13.055, df = 2, p-value = 0.001463
#得到p-value = 0.001463<0.05,拒绝原假设, 说明Treatment与Improved这两个变量之间不是独立的



mytable1 <-table(Arthritis$Sex,Arthritis$Improved)
> chisq.test(mytable1)

	Pearson's Chi-squared test

data:  mytable1
X-squared = 4.8407, df = 2, p-value = 0.08889
#p-value = 0.08889>0.05, 说明两者是独立的,无关系

2. 费舍尔精确检验

费舍尔精确检验是一种非参数的精确检验方法,适用于边界固定的列联表。该检验的原假设是行和列之间是独立的,并且基于随机分配的模型来计算p值。

#Fisher精确检验的原假设是:边界固定的列联表中行和列相互独立的
mytable <- xtabs(~Improved+Treatment,data = Arthritis)
> fisher.test(mytable)

	Fisher's Exact Test for Count Data

data:  mytable
p-value = 0.001393
alternative hypothesis: two.sided
#p-value = 0.001393《0.05,说明拒绝原假设,即列联表中的行和列有关系。

3. Mantel-Haenszel检验

Mantel-Haenszel检验用于比较两个二元变量在多个分类变量的不同值上的分布是否独立。如果只有两个二元变量,可以使用卡方独立性检验或费舍尔精确检验来进行独立性检验。

#Mantel-Haenszel检验,用于比较两个二元变量在一个或多个分类变量的不同值上的分布是否独立。
mytable <- xtabs(~Treatment+Improved+Sex,data = Arthritis)
> mantelhaen.test(mytable)

	Cochran-Mantel-Haenszel test

data:  mytable
Cochran-Mantel-Haenszel M^2 = 14.632, df = 2,
p-value = 0.0006647
#结果为p值约等于0.0006,小于0.05,也就说明,药物治疗和改善情况在性别的每一个水平上不独立(因为这里使用了性别做第三层分类量)



#如果调整变量顺序,反映的结果是有差别的
mytable <- xtabs(~Treatment+Sex+Improved,data = Arthritis)
> mantelhaen.test(mytable)

	Mantel-Haenszel chi-squared test with continuity
	correction

data:  mytable
Mantel-Haenszel X-squared = 2.0863, df = 1,
p-value = 0.1486
alternative hypothesis: true common odds ratio is not equal to 1
95 percent confidence interval:
 0.8566711 8.0070521
sample estimates:
common odds ratio 
         2.619048 

4. 其它

cor.test():进行相关性检验,可以用于检验两个连续变量之间的相关性。

t.test():进行独立样本t检验,适用于比较两个独立样本的均值是否有显著差异。

ks.test():进行Kolmogorov-Smirnov检验,用于比较两个样本的分布函数是否有显著差异。

wilcox.test():进行Wilcoxon符号秩检验,适用于两个相关样本之间的独立性检验。

这些函数在不同情境下具有不同的使用条件和假设条件,具体使用哪个函数需要根据数据类型和研究问题来决定.

二、相关性分析与检验函数

1. 分析函数

#计算相关性系数都使用同一个函数:cor()函数
?cor
state.x77 %>% class()
##一般相关数据都是在[0,1]之间,数值越大越相关,正负号表示是正相关还是负相关
cor(state.x77)



#协方差,衡量两个变量的总体误差
?cov
cov(state.x77)
x <- state.x77[,c(1,2,3,6)]
y <- state.x77[,c(4,5)]
head(x)
head(y)
> cov(x,y)
               Life Exp      Murder
Population -407.8424612 5663.523714
Income      280.6631837 -521.894286
Illiteracy   -0.4815122    1.581776
HS Grad       6.3126849  -14.549616



#可以使用“ggm”这个包中的pcor()函数计算偏相关系数
library(ggm)

##偏相关系数是指在控制一个或者多个变量时,剩余其他变量之间的相互关系
pcor(c(1,5,2,3,6),cov(state.x77))
#第一个参数是一个数值向量(前两个数值表示要计算相关系数的下标,其余的数值为条件变量的下标),第二个参数是cov()函数计算出来的协方差结果

2. 检验函数

#Cor.test()只能一次性检测一组变量的关系
> cor.test(state.x77[,3],state.x77[,5])

	Pearson's product-moment correlation

data:  state.x77[, 3] and state.x77[, 5]
t = 6.8479, df = 48, p-value = 1.258e-08
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.5279280 0.8207295
sample estimates:
      cor 
0.7029752 



#psych包中的corr.test()函数可以一次性进行多个变量的检验,这个函数还可以进行递归操作
library(psych)
#函数不仅计算了相关系数,还给出了检测值
corr.test(state.x77)


#x是pcor()函数计算的偏相关系数,然后是要控制的变量数,最后就是样本数
x <- pcor(c(1,5,2,3,6),cov(state.x77))
> ggm::pcor.test(x,3,50)
$tval
[1] 2.476049

$df
[1] 45

$pvalue
[1] 0.01711252
#返回三个值,分别是t检验,自由度和p value
#分组数据的相关性检验,这种分组的检验可以使用t检验,t检验使用t分布理论,推论差异分布的概率,从而比较两个平均数的差异是否显著



##使用t.test()进行独立样本的t检验,t.test(y~x),y是一个数值型变量,x是类别型变量
library(MASS)
> t.test(Prob~So,data=UScrime)

	Welch Two Sample t-test

data:  Prob by So
t = -3.8954, df = 24.925, p-value = 0.0006506
alternative hypothesis: true difference in means between group 0 and group 1 is not equal to 0
95 percent confidence interval:
 -0.03852569 -0.01187439
sample estimates:
mean in group 0 mean in group 1 
     0.03851265      0.06371269 
#P<0.05,因此可以拒绝南方各州北方各州拥有相同犯罪率的假设,及拒绝原假设,表明有显著差异
#因为原假设就是虚无假设,虚无假设就是假设没区别




3. 补充说明

根据数据的分布特点和检验的假设条件,我们可以将检验方法分为参数检验和非参数检验

  1. 参数检验是在总体分布形式已知的情况下,对总体分布的参数如均值、方差等进行推断的方法,常见的参数检验方法包括t检验、卡方检验、fisher检验等

  2. 非参数检验在总体方差未知或者知道甚少的情况下,利用样本数据对总体分布形态等进行推断的方法,常见的非参数检验方法包括Wilcoxon秩和检验、Wald-Wolfowitz游程检验等

三、绘图函数

R基础绘图系统包括两种绘图,高级绘图是一步到位可以直接绘制出图,
低级绘图,不能单独使用,必须在高级绘图产生图形的基础上,对图形进行调整,比如加一条线,加上标题文字等。

#对于绘图函数要注意的是输入数据的格式
ls("package:graphics")
#查看R中关于图形的一些示例演示并配代码
demo(graphics)
example("heatmap")
#查看plot函数的子函数
methods(plot)


plot(women)
#数据为因子类型,则绘制出直方图
plot(as.factor(mtcars$cyl))
#散点图
plot(mtcars$cyl)

##如果输入第一个数据是一个因子,第二个数据是一个数值数据,则是箱线图
plot(as.factor(mtcars$cyl),mtcars$carb)

#如果两个输入数据都是因子,输出的就是棘状图
plot(as.factor(mtcars$cyl),as.factor(mtcars$carb))


fit <- lm(height~weight,data=women)
summary(fit)
plot(fit)

#可自行添加绘图参数
plot(as.factor(mtcars$cyl),col=c("red","green","blue"))

绘图一般建议直接使用ggplot2包,比较好理解和记忆。

四、自定义函数

一个完整的R函数需要包括函数名称、函数声明、函数参数、函数体。

1. 公式函数

偏度(skewness),是统计数据分布偏斜方向和程度的度量,是统计数据分布非对称程度的数字特征
峰度(peakness; kurtosis),又称峰态系数,表征概率密度分布曲线在平均值处峰值高低的特征数

mystats <- function(x,na.omit=FALSE){
  if(na.omit)
    x <- x[!is.na(x)]
  m <- mean(x)
  n <- length(x)
  s <- sd(x)
  skew <- sum((x-m^3/s^3))/n
  kurt <- sum((x-m^4/s^4))/n-3
  return(c(n=n,mean=m,sd=s,skewness=skew,kurtosis=kurt))
  
}

> mystats(1:100)
        n      mean     stdev      skew  kurtosis 
100.00000  50.50000  29.01149  45.22571  38.31910 

代码解释:

  1. 第一个选项参数x就是要计算的数据,是一个数值向量

  2. 第二个选项是na.omit,用于删除缺失值,默认取值为FALSE,

  3. 然后是大括号,用于写函数的主体

  4. 然后是逻辑判断:如果有缺失值,那么x只取不包含缺失值的x的值

  5. 之后便是根据数学公式来计算偏度与峰度,最后返回结果

2. 循环函数

函数内部通过循环实现向量化操作,循环的三部分:条件判断,是真是假,用于循环执行的结构,表达式

#使用for循环
xunhuan <- function(x){
  for(i in x){
    print("hello world")
  }
}
> xunhuan(c(1:5))
[1] "hello world"
[1] "hello world"
[1] "hello world"
[1] "hello world"
[1] "hello world"


#使用while循环
xunhuan <- function(x){
  i=1;while(i<=x){
    print("wht");i = i+1
  }
}
> xunhuan(3)
[1] "wht"
[1] "wht"
[1] "wht"


#使用条件判断
xunhuan <- function(score){
  if(score>=60){
    print("合格")
  } else  {print("不及格")}
}
> xunhuan(60)
[1] "合格"
> xunhuan(50)
[1] "不及格"

#或者直接使用ifelse()
ifelse(score>60,print("合格"),print("不及格"))


总结

今天,简单介绍了一些统计函数:独立性检验函数、相关分析函数、绘图函数、自定义函数。随着不断的使用R语言,自定义函数是十分必要的,能帮助我们省去许多重复性的代码编写。好了,今天的总结就到这里了。
落霞与孤鹜齐飞,秋水共长天一色。

–2023-7-26 筑基篇

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

星石传说

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

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

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

打赏作者

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

抵扣说明:

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

余额充值