写R脚本:以对多分组数据进行正态分布检验为例

问题提出

正态分布检验一次只能检验一个分组,如果有多组数据需要检验,则需要运行多次

解决思路

  • 使用循环命令可以实现按一定规则计算。
  • 如果以后也经常需要使用,写成脚本调用更方便些,需要使用的时候直接调用即可。
  • 脚本针对的场景相对直接使用循环命令更广泛写,如果仅使用循环命令,很多参数与类型定义直接使用数据对应的即可,因此写脚本难度相对高一些,但是设计出可以通用的脚本也是小小的成就。

设计框架

函数名与参数

从分组是否符合生态分布需要输入数据出发,定义的函数设计以下内容:

  • 函数名,这个无所谓,只要不是数字开头,不含符号字符即可。先做个简单的脚本,只用Shapiro-Wilk法进行检验,因为要检验多个,就假设multi,关键词之间,可以用“.”隔开,函数名shapiro.test.multi。
  • 数据集,数据类型多样,通常是数据框。
  • 分组变量名,需要获取分组变量不重复的值,分组的数据可能是文本型也可能是数值,通常是文本型。所以先只定义文本型的。
  • 计算值变量名,根据不同的分组名提取此值为向量,此数据必须为数值。

输出数据框

从输出来看,需要得到一张表,这个表要包含计算得到的重要信息:

  • 分组名
  • 统计量,对于Shapiro-Wilk来说,即W
  • 概率值,即p.value
  • 分布的判断结果,如果p.value > 0.05,则判断符合正态分布

定义用于存储数据的数据框

  • 数据框应包含输出数据框所需变量信息
  • 定义为空的数据框以便填入数据

使用管道函数简洁代码

  • 需要加载管道函数的程序包magrittr,使用require(),判断是否已经加载,如未加载则加载。
shapiro.test.multi <- function(   #定义函数名
  data,   #定义函数第一个参数
  value,  #第2参数
  group)  #第3参数
  {       #开始计算

  require(magrittr)   #按需要加载管道函数包

  table(data[,group]) %>%   #提取分组信息,此处即为统计group中值出现的次数,达到了去重的目的
    data.frame(.) -> a1   #将提取信息从table格式转为数据库data.frame并存为a1,这样才能提取其中一列转为向量

  a2 <- as.vector(a1[,1])  #将a1数据的第一列转为向量,这一列即为不重复的分组信息

  data = data.frame(group = data[,group],  #对数据集进行关键变量的提取,提取分组变量为data数据集的group变量
                    value = data[,value])  #提取计算值为data数据集的value

  test.result <- data.frame(No=0,        #行号
                            Name=0,      #分组名
                            W=0,         #W值
                            p.value=0,   #p值
                            norm.test=0) #检测结果

  for (i in (1:length(a2))){     #定义for循环计算,从1到a2的长度值这样一个区间,a2的长度即为分组的数量
    subset(data,                 #指定取数据集    换行写代码使层次更清晰
           group == a2[i],       #定义去子集的条件,“==”为判断
           select = value) %>%   #定义需要取集的变量/列,“=”为定义
      .[,1] %>%                  #  "."定义计算结果放置的位置
      shapiro.test(.) -> t.r     #进行正态检验分布并存储为t.r

    test.result[i,1] = i              #存储组序号
    test.result[i,2] = a2[i]          #存储分组名
    test.result[i,3] = t.r$statistic  #存储W统计量
    test.result[i,4] = t.r$p.value    #存储计算的p值

    if      #if判断
    (t.r$p.value > 0.05)           #判断条件
      test.result[i,5] = "Norm"    #通过判断后的命令
      else
        test.result[i,5] = "Other_situation"  #未通过判断执行的命令
    } #结束循环计算

   test.result[nrow( test.result)+1,1] = "Test Method:"  #给数据框加上检验正态分布方法信息,在最后一行之后加上一行,在第1列放入次数据
   test.result[nrow( test.result),2] = "Shapiro-Wilk"    #同上行,存在第二列

  test.result  #显示用于存储计算结果的数据框
}              #脚本结束
此处以iris数据为例,计算测量的三个物种的花瓣长度值是否都符合正态分布假设。
shapiro.test.multi(iris,value = "Sepal.Length",group = "Species")

运行结果

- No Name W p.value norm.test
1 1 setosa 0.9776985 0.4595132 Norm
2 2 versicolor 0.9778357 0.4647370 Norm
3 3 virginica 0.9711794 0.2583147 Norm
4 Test Method: Shapiro-Wilk NA NA NA

原文地址:https://www.cnblogs.com/yanlingbin/p/10546943.html

时间: 2024-11-08 20:52:47

写R脚本:以对多分组数据进行正态分布检验为例的相关文章

R(二): http与R脚本通讯环境安装

结合实际的工作环境,在开始R研究的时候,首先着手收集的就是能以Web方式发布R运行结果的基础框架,无耐的是,R一直以来常使用于个人电脑的客户端程序上,大家习惯性的下载R安装包,在自己的电脑上安装 --> 写算法 --> 运行 --> 以贴图或者文档的形式发表自己的作品.幸运的最终找着了一套这样的框架FastRWeb (Fast Interactive Web Framework for Data Mining Using R),参考 (http://www.rforge.net/Fast

十分钟学会写shell脚本

大家好!我是handsomecui,下面我为大家讲解一下shell脚本的写法,讲的不好的地方,欢迎大家留言拍砖. 1.在linux下会写shell脚本是非常重要的,下面我参照例子给大家展示几个脚本,顺带这学习shell 的语法: 什么时候helloworld是必不可少的,第一个脚本肯定与helloworld是离不开的: #!/bin/sh a="hello world!" num=2 echo "a is : $a num is : ${num}nd" 运行结果:

16.03.18 【练习】case的用法 写一个脚本

写一个脚本,可以结合艘选项及参数,而后能获取每一个选项,及选项的参数,并能根据选项及参数做出特定的操作,比如:adminusers.sh --add tom,blair --del tom,blair -v|--verbose -h|--help #!/bin/bash # DEBUG=0 ADD=0 DEL=0 for i in `seq 0 $#`; do if [ $# -gt 0 ]; then case $1 in -v|--verbose) DEBUG=1 shift ;; -h|-

编写运行R脚本

1.在后台运行R 1.1 创建file.R文件 1.2 在文件首行键入: #! /path/to/Rscript 1.3 在下面的行中,键入R代码 1.4 保存(记得有png(),jpeg(),...等函数的代码最后一定要有dev.off()) 1.5 在file.R的工作目录下,在终端中输入以下命令: R CMD BATCH --args file.R 1.6 file.R被运行了!!! 优点: R命令行下打错命令后回车,之前的所有相关命令几乎全军覆没.如果不想发生这种情况,请写一个file.

VS中使用QT调用R脚本

一开始想直接把R编译成库然后调用R,后来查了n多资料,发现VS中是无法办到的,官方也给出了一句话,大概意思就是没可能在VS中使用R提供的C++接口,大概是涉及到了底层的ABI的原因,具体也不太清楚. 于是就想到了直接采用新建文件然后写成.R脚本的方式来调用R,这种使用方式必须安装R,然后从程序内部调用RScript.exe以及相应脚本. QFile Rfile("C:\\temp\\RScript\\heatmap.R"); Rfile.open(QIODevice::WriteOnl

python写一个脚本解析文件

Python写一个脚本解析文件 ----基于Red Hat Enterprise Linux Server release 6.4 (Santiago):python 2.6.6 需求: 1.去掉空行 2.去掉空行后输出到一个新文件 附加需求(排版):1.'-'缩进n个字符 '-'缩进2n个字符 以此类推 2.'-'开头的所有句子输出在一行 '-'开头的句子输出在一行 以此类推 --------------------------------------------分隔线------------

不要问我有多懒,写个脚本跑django

写django的都知道,要跑起django测试环境,只需要 1 python manage.py runserver 0.0.0.0:8000 就可以了,但是时间一长,就觉得敲这个命令太浪费时间了,而我又是个懒人. 同事用的是ctrl+ r,但是有时候还是会出现我不想要的. 那么,简单的就是写个shell,但我这种人,实在太懒,根本没时间学shell编程. 所以随便百度下,就写成下面这样. 1 #!/bin/sh 2 python manage.py runserver 0.0.0.0:8090

JAVA调用R脚本

0 前言R是一种非常方便易用的绘图.统计分析.ML算法设计方面的脚本语言.实际中有这样一种场景:算法工程师用R搭建了机器学习算法模型,想用于javaweb之中但是又不想重新用java写一遍算法模型,那么可以考虑java程序中直接调用R的脚本.JAVA负责系统的构建,R用来做运算引擎,从而实现应用型和分析性相结合的系统. 本文将搞清楚如下几个问题: 1)java调用R的方式有哪些及每种方式如何使用? 2)这些调用方式的有哪些优缺点? 下面开始. 1 java调用R的两种方式1.1 远程调用模式(使

Qpython : 如何上传自己写的脚本

google 被墙了,sl4a 装不了,python for android 也装不了.现在开始用 Qpython , 发现装起来也方便. 点击右上角的菜单图标(三点): 出现设置对话表单,选FTP服务, 启动FTP服务. 如何上传自己写的脚本, 在Windows上用 upload.py # -*- coding: utf-8 -*- import ftplib import time import os, sys, time def now(): return time.strftime('%