背景与问题

在数据分析中最常用的的参数方法,都需要先进行正态性、方差齐性检验。然而R中Shapiro-Wilk(夏皮罗)W正态性检验【命令shapiro.test()】、Kolmogorov-Smirnov正态性检验【ks.test()】分析的对象都只是对一个数值型向量可用,没有相应的S3 method,在面临多分组单变量、多分组多变量时,我等新手往往束手无策。具体说来,使用正态性检验的命令,不像是方差齐性/异质性检验(Bartlett Test of Homogeneity of Variances)【bartlett.test( )】命令有S3 method、S3 method for class ‘formula’,可以直接针对数据框多分组单变量进行分析。

实现方法与途径

实现多分组单变量、多分组多变量分析的关键问题在于数据的操作方法,而不是检验方法本身。其实在R里面有不少命令可以实现分组操作,如by()"doBy"程序包等,有相关命令可实现。
与下面使用的代码不同的是,by()计算分析结果以提示信息形式呈现(而不是表格形式列出),"doBy"程序包不是R内置的包,需要安装后加载使用。内置程序的命令中,数据分组/分割/切片可使用split()命令进行,分割后的数据为'list'格式;分析结果表提取可利用sapply()命令直接获得,该命令对'list'进行计算后输出结果为'data.frame'格式,如果需要获得'list'格式的,使用lapply()命令。结合split()sapply()即可进行数据分割及批量结果输出。

单变量多样本组分析例1

# 单变量多样本组分析
## Shapiro-Wilk(夏皮罗)W正态性检验
sapply( split(iris$Sepal.Length, # 响应变量iris$Species),  # 分组变量shapiro.test) # 分析使用的命令

单变量多样本组分析例2

# 单变量多样本组分析
## Kolmogorov-Smirnov正态性检验
sapply( split(iris$Sepal.Length, # 响应变量iris$Species),  # 分组变量function(d.f) ks.test(d.f, 'pnorm', mean(d.f), sd(d.f)) # 分析使用的命令
)

多变量多样本组分析例1

# 多变量多样本组分析
## Shapiro-Wilk(夏皮罗)W正态性检验
iris.a = list() # 生成空列表用于存储分析结果
data.clip <- split(iris[1:4], # 需要检验的响应变量在数据集中的哪些列iris$Species) # 分组变量所在列
for(i in names(data.clip)) { # 使用for循环进行多变量分析iris.a[[i]] = sapply(data.clip[[i]], shapiro.test) # 分析使用的命令
}
iris.a # 查看计算结果

多变量多样本组分析例2

# 多变量多样本组分析
## Kolmogorov-Smirnov正态性检验
iris.a = list() # 生成空列表用于存储分析结果
data.clip <- split(iris[1:4], # 需要检验的响应变量在数据集中的哪些列iris$Species) # 分组变量所在列
for(i in names(data.clip)) { # 使用for循环进行多变量分析iris.a[[i]] = sapply(data.clip[[i]], function(d.f) ks.test(d.f, 'pnorm', mean(d.f), sd(d.f))) # 分析使用的命令
}
iris.a # 查看计算结果

这两个例子的代码,可以拓展、移植到很多分析命令上,只需要改动分析使用的命令即可(见拓展部分)。对于单变量多样本组的分析,这个命令效率应该是最高的了。而对于多变量多样本组分析,因为其中涉及到使用for循环,在数据量大的时候可能速度慢(没有测试过,一般认为R中循环计算的效率低下),目前没有想到更高效的方法,欢迎指教。

拓展

比如在进行描述统计时,统计指标较多,基于向量的计算分析自编分析命令脚本,脚本的编写上要简单很多,如下:

自编描述统计脚本

# 描述统计脚本
## 计算众数函数定义
majority <- function(x){result = tryCatch({as.numeric(names(table(x))[table(x) == max(table(x))])}, warning = function(w) {names(table(x))[table(x) == max(table(x))]})return(result)
}
# 描述统计脚本主体函数
data.describe <- function(x){N = length(x) # 样本容量(数)x.b = mean(x) # 均值V = var(x) # 方差S = sd(x) # 标准差Me = median(x) # 中位数CV = 100 * S/x.b # 变异系数Max = max(x) # 最大值Min = min(x) # 最小值R = max(x) - min(x) # 极差SE = S/sqrt(N) # 标准误skew = N/((N-1)*(N-2)*S^3) * sum((x - x.b)^3) # 偏度系数kurt = N*(N+1)/((N-1)*(N-2)*(N-3)*S^4) *sum((x - x.b)^4) -3*(N-1)^2/((N-2)*(N-3)) # 峰度系数maj = paste(majority(x), collapse="/") # 众数(需计算众数脚本),可能有多个,需组合data.frame( # 建立数据框输出结果N = N, Mean = x.b, Var = V, Sd = S,Median = Me, CV = CV, SE = SE,Max = Max, Min = Min, Range = R,Majority = maj, Skew = skew, Kurt = kurt,row.names = c(substitute(x))) # 提取分析对象名称用于结果标识
}

基于自编脚本进行多分组多变量的描述统计

组合向量计算分析的脚本(data.describe())与数据操作命令(split()sapply())使用,同样以iris数据集为例。

单变量描述统计

# 单变量描述统计
data.describe(iris$Sepal.Length)

多变量描述统计

# 多变量描述统计
sapply(iris[1:4], data.describe) # 对多列数据进行描述统计分析

多组样本单变量描述统计

# 多组样本单变量描述统计
sapply(
split(iris$Sepal.Length, # 对此数据进行分割(切片、分组)
iris$Species), # 分割(切片、分组)的变量
data.describe # sapply计算使用的命令
)

多组样本多变量描述统计

# 多组样本多变量描述统计
iris.a = list() # 生成空列表
data.clip <- split(iris[1:4], iris$Species) # 对多列数据进行分割
for(i in names(data.clip)) {iris.a[[i]] =
sapply(data.clip[[i]],
data.describe) # 对多列数据进行描述统计分析
}
iris.a # 查看计算结果

瞎说两句

对于非科班、没有系统学习的人来说,学习任何一门技能、知识本身要走过很多弯路。然而走过弯路进入坦途的人,无论是何原因,很少有人再回来引导跌跌撞撞的初学者,进入坦途后,多数忙着有意无意的建壁垒拉差距、圈地盘坐享其成。
在课程改革探索中,有幸接了两个学期的《生物统计附试验设计》课程,倒逼自己系统学习基础内容,真正深刻体会教学相长,今天看到以前写的博文,发现原来想要解决的问题,原本有很多简单的组合、方法、途径可以实现的东西,比如要进行多分组数据进行正态分布检验。反思过来,实际上是自己对数据操作的学习不够系统造成。

R中多分组多变量分析计算的问题相关推荐

  1. R中因子分析的得分计算

    转载自:http://blog.csdn.net/liuxincumt/article/details/8110127 主要是为了理解因子得分,跟factanal计算出来的比较. data(USArr ...

  2. html表格统计平均成绩,使用R中的data.table计算加权平均值,其中一个表列中的权重...

    我有一个data.table如下所示.我正在尝试计算数据子集的加权平均值.我尝试了以下MWE的两种方法 set.seed(12345) dt = data.table(a =c(10,20,25,10 ...

  3. SQL中的分组函数的使用

    什么是分组函数? 分组函数是作用在一组数据中,返回一个结果的函数,包括组函数:AVG,COUNT,MAX,MIN,SUM: 数据说明 有五个表:学生表,老师表,课程表,学院表,课程成绩表. 表结构 初 ...

  4. R语言使用dplyr包的group_by函数和summarise函数基于分组变量计算分析中涉及的所有协变量的均值(Difference in means of covariates)

    R语言使用dplyr包的group_by函数和summarise函数基于分组变量计算分析中涉及的所有协变量的均值(Difference in means of covariates) 目录

  5. pandas使用groupby函数计算dataframe数据中每个分组的N个数值的指数权重移动(滚动)平均、例如,计算某公司的多个店铺每N天(5天)的滚动销售额指数权重移动(滚动)平均

    pandas使用groupby函数计算dataframe数据中每个分组的N个数值的指数权重移动(滚动)平均(Exponential Moving Average).例如,计算某公司的多个店铺每N天(5 ...

  6. pandas使用groupby函数计算dataframe数据中每个分组的N个数值的滚动最大值(rolling max)、例如,计算某公司的多个店铺每N天(5天)的滚动销售额最大值

    pandas使用groupby函数计算dataframe数据中每个分组的N个数值的滚动最大值(rolling max).例如,计算某公司的多个店铺每N天(5天)的滚动销售额最大值 目录

  7. pandas使用groupby函数计算dataframe数据中每个分组的N个数值的滚动计数个数(rolling count)、例如,计算某公司的多个店铺每N天(5天)的滚动销售额计数个数

    pandas使用groupby函数计算dataframe数据中每个分组的N个数值的滚动计数个数(rolling count).例如,计算某公司的多个店铺每N天(5天)的滚动销售额计数个数 目录

  8. pandas使用groupby函数计算dataframe数据中每个分组的N个数值的滚动标准差(rolling std)、例如,计算某公司的多个店铺每N天(5天)的滚动销售额标准差

    pandas使用groupby函数计算dataframe数据中每个分组的N个数值的滚动标准差(rolling std).例如,计算某公司的多个店铺每N天(5天)的滚动销售额标准差 目录

  9. python使用pandas计算dataframe中每个分组的分位数极差、分组数据的分位数极差(range)、使用groupby函数和agg函数计算分组的两个分位数

    python使用pandas计算dataframe中每个分组的分位数极差.分组数据的分位数极差(range).使用groupby函数和agg函数计算分组的两个分位数 目录

最新文章

  1. Bug改到怀疑人生…… | 每日趣闻
  2. 应对恶劣网络环境,为php-curl设置超时限制,防止服务器卡死
  3. Python进阶_wxpy学习:用微信监控你的程序
  4. java中乐观锁_Java中乐观锁与悲观锁的实现
  5. python将图片导出数据库_python 将图片转换为base64编码转储进数据库
  6. --------------比大小---------------大数比大小 这个方法 值得 留念
  7. 计算机科学 —— 时间戳(timestamp)
  8. 模糊测试——强制发掘安全漏洞的利器(Jolt 大奖精选丛书)
  9. 使用同源建模预测蛋白质结构
  10. 为影像数据去除无效值
  11. Python爬虫实现网页自动刷票
  12. 电子邮箱是什么,电子邮箱注册值得入手的邮箱都在这!
  13. 如何使文章分栏脚注不分栏?
  14. 关于母亲节的c语言程序设计教程课后答案,《我的母亲》习题及参考答案
  15. java s c r ipt_Java Scr ipt高级应用与实践_前端开发教程_源雷技术空间
  16. 图解:HTTP 范围请求,助力断点续传,多线程下载的核心原理 | 实用HTTP
  17. 分享郑州买房流程与需要手续
  18. javascript判断是否为移动端
  19. R语言将向量数据按照行方式转化为矩阵数据(设置参数byrow为TRUE)、对矩阵进行转置操作
  20. 小学五年级自创编程语言,这读者太强了!

热门文章

  1. 双极性四线步进电机的控制(四拍、八拍时序,细分微步控制方式)
  2. 达梦数据库创建表空间和用户
  3. 蒙哥马利快速幂摸算法
  4. qdatetime.h C2589 C2059
  5. 2022年最新江苏交安安全员考试题库及答案
  6. Hadoop空闲时无法提交任务
  7. 宜泊科技与阿里云联合打造基于云原生架构的停车系统解决方案,加速智慧停车产业数字化发展
  8. dhcp服务器的客户端信息是什么,DHCP服务是什么?实现过程是什么?
  9. linux fsck
  10. SpringBoot Web容器配置之 Undertow