【神州学人新闻】

参数、测量与统计量
假设老师想了解一个学生对知识的掌握情况(参数),对全班进行了几次测验(测量),然后计算出测验的平均分(统计量)。统计量是随机的,讨论某个统计量的准确性毫无意义。因此,费舍尔提出了三个准则:
- 一致性(consistency):得到的数据越多,计算出来的统计量接近参数真实值的概率越大;
- 无偏性(unbiasedness):如果多组不同的数据多次测量某一特定的统计量,那么该统计量的均值应该近似于这个参数的真值;
- 有效性(efficiency):统计量的值不会完全等于该参数的真值,但是用来估计参数的大多数统计量应该与参数真值相差不大。
计数原理
n表示总集,r表示取出次数。
基本计数规则(The fundamental counting rule)
每种选择相乘。如:冰激凌有5种口味,每种口味都有大、中、小杯,还可以选择浇汁或不浇汁,则总计选择有5×3×2=30种。
每个选择相当于从n个总集中抽取r个,但此时r=n,即全部都可以抽取。
另一个例子:
A、B、C为总集n,r=4次,则可以得到3×3×3×3=81种不同的情况(顺序不同抽取不同)。
排列(Permutations)
从n个东西中取出r次,每次选择不能重复。
如:
A、B、C为总集n,r=2。
可以得到3!/(3-2)!=6。结果如下:
A B A C B A B C C A C B 组合(Combinations)

从n个东西中取出r次,每次选择不同重复,且顺序无关。
如:
A、B、C为总集n,r=2。
可以得到3!/2!(3-2)!=3。结果如下:
A B A C B C
贝叶斯基本公式

P(A|B)为条件概率,在样本空间中,B发生的条件下,A发生的概率。
P(A’)中的A’读A-prime,表示非A。
定义:P(A)+P(A’)=1
经典的概率公式,通过条件B先定行或列,再通过A/total(B)得到概率。
第四章 R语言的数据框(data.frame)
数据框是R语言最重要的数据表现形式,数以万计的数据通过形成一个巨大的“表”来标准化数据结构,再从中抽取部分或全部数据用于分析,这个“表”叫做数据框。数据框和矩阵非常类似,不同点在于,数据框可以指定每一列的数据类型,而整个矩阵只能有且只有一种数据类型。
下面,我们尝试录入数据类型。
数据表4-1
姓名 性别 英语成绩 评定 张三 男 95 优秀 李四 女 84 良好 王五 男 61 合格 从表4-1中不难发现,数据并非都是数值型,还有字符型的列,比如性别和评定。此时,用数据框就更为合适,因为数据框可以为每一列分配不同的数据类型。数据框在使用上更加符合人类的习惯,因为数据并不只有数值型,还是有很多其他类型,如定性类:姓名、性别、邮政编码、民族、态度(同意、不同意)、分级等。这些可以用字符串(string)来表示,也可以用因子(factor)表示。
我们可以通过下面的方法构建数据框:
names <- c("张三", "李四", "王五")gender <- c("男", "女", "男")English_scores <- c(95, 84, 61)evaluation <- c("优", "良", "合格")dataframe <- data.frame(names=names,gender=gender,English_scores=English_scores,evaluation=evaluation)dataframeclass(dataframe)上面列举了一种通过向量获得数据框的方法,当然还可以先将向量转换成矩阵,再转换成数据框。
dataframe2 <- cbind(names,gender,English_scores,evaluation)dataframe2 <- as.data.frame(dataframe2)dataframe2当只有纸制记录的原始数据,需要录入的时候,比较麻烦,可以通过下面的方式录入的R语言的数据框。
dataframe <- data.frame(names=c("张三", "李四", "王五"),
gender=c("男", "女", "男"),
English_scores=c(95, 84, 61),
evaluation=c("优", "良", "合格"))dataframe在数据量大的时候,通过上述方式逐个录入是很容易出错的,最好是先录入到Excel中,在读取到R程序,后面会有章节专门介绍。
思考题
- 数据框和矩阵有哪些区别?
- 自己编造一个四行四列的数据,手动录入到R的一个变量中,并显示出来。
第六章 R语言的逻辑值
R语言的逻辑值(也称布尔值,Boolean)共有两种,TRUE和FALSE,可以简写为T和F,注意都是大写的。它们也可以用数值1和0表示。
一般而言,判断运算得到的是逻辑值。例如,1>2,会返回FALSE;5>=1,会返回TRUE;10==10,会返回TRUE,这里要注意,判断运算的相等需要写2个等号,因为一个等号已经做赋值符号用了等同于'<-‘。
在R语言中,不仅数值可以计算逻辑值,逻辑值和字符串也可以计算逻辑值。你可以尝试使用TRUE==TRUE来计算逻辑结果;也可以利用”a”==”A”来计算逻辑结果;还可以计算TRUE==1。
不等于也是一个判断符号,但是R语言中的不等于符号并不是≠,而是!=。例如,4!=5,会返回TRUE。!的作用是取反,!=的意思是对相等取反,就是不等于的意思。同理,!可以与逻辑值连用,起到对逻辑值取反的作用。如:!TRUE的结果是FALSE;!FALSE的结果是TRUE。!可以和不等式连用,像!5>7得到的结果是TRUE,这里的计算顺序是先算5>7,结果为FALSE,再取反,得到TRUE。可以看出,计算的优先顺序,不等式计算优先级要高于取反运算。
在实际应用中,我们常常会遇到多个条件判断的情形。看这个例子,一群学生考研,英语需要高于40,政治需要高于60,专业课需要高于70分才能录取。此时,就需要多个判断运算同时起作用。
假如:小红的英语、政治和专业课成绩分别为xiaohong <- c(41,75,90),用判断语句判断小红是否考上的判断是:
xiaohong[1] > 40 & xiaohong[2] > 60 & xiaohong[3] > 70

不难看出,多个条件并列用&符号链接,&表示与,必须所有条件都为TRUE才为TRUE;相应的,|符合表示或,只要有一个条件为TRUE即为TRUE。
当一个逻辑值和一个逻辑值向量并列时,&符号会将单个逻辑值复制为向量的个数,然后一一进行运算。
TRUE & c(TRUE,FALSE,FALSE)

这可能并不是我们想要的结果,如果我们只想对向量中的第一个逻辑值进行运算,可以使用严格并列符号&&和严格或符号||。这样,向量中只有第一个逻辑值会和前面的逻辑值发生运算。
TRUE || c(TRUE, FALSE ,FALSE)

判断函数,isTRUE()和isFALSE(),判断逻辑值的判断函数,说起来很拗口。顾名思义,isTRUE的参数为TRUE时,结果为TRUE,否则为FALSE;isFALSE的参数为FALSE是,结果为TRUE,否则为FALSE。自己可以练习一下。
identical()函数可以判断两个对象是否完全相等。完全相等则为TRUE,不完全相等则为FALSE。传入的两个参数顺序可以颠倒,可以使用变量。
identical(c(1,2,3),c(1,2,3))

xor()函数叫做亦或判断函数,如果两个参数一个是TRUE一个是FALSE则返回TRUE,否则返回FALSE。在该函数中,FALSE可以用0表示,0以外的其他数字都相当于TRUE。
xor(0,-1)
xor(1,-1)
xor(TRUE,FALSE)
逻辑值在筛选数据上具有巨大的作用。当学校的英语成绩为14,34,56,34,78,68,87,69,88,100时,要快速挑出不及格的分数,可以用which函数和逻辑运算。
scores <- c(14, 34, 56, 34, 78, 68, 87, 69, 88, 100)
which(scores < 60)
scores[which(scores < 60)]
当统计全校的分数时,数据量已经很大,很难一眼看出是否有不及格的同学,这个时候可以使用any()函数:只要有一个满足条件即为TRUE。any(scores < 60)返回TRUE,说明数据中有不及格的分数。
scores <- c(14, 34, 56, 34, 78, 68, 87, 69, 88, 100)
any(scores < 60)
同理,我们可以用all()函数判断是否所有人都及格了。很明显,并不是所有人都及格了。
all(scores > 60)

当需要加载R包的时候,用requrie()函数可以返回逻辑值,加载成功为TRUE,加载失败为FALSE。
思考题
1. 下列返回FALSE的是哪个选项?
A:9 >= 10
B:7 == 7
C:0 > -36
D:6 < 82. 下列哪个选项返回TRUE?
A:9 >= 10
B:57 < 8
C:7 == 9
D:-6 > -73. 下列哪个选项返回FALSE?
A:9 < 10
B:!FALSE
C:!(0 >= -1)
D:7 != 84. 请说明逻辑与&和严格逻辑与&&的区别?
5. 5>8||6!=8&&4>3.9的结果?
6. 下列结果为TRUE的是?
A:TRUE && FALSE || 10 >= 5 && 1 < 8
B:FALSE || TRUE && FALSE
C:99.99 > 100 || 28 < 2.3 || 8 != 8.0
D:TRUE && 15 < 15 && 6 >= 67. 下列结果为FALSE的是?
A:FALSE && 12 >= 12 || 1 >= 4 || 80 <= 49.5
B:6 >= -3 && !(9 > 10) && !(!TRUE)
C:FALSE || TRUE && 8 != 1 || 26 > 3
D:!(8 > 7) || 19 == 19.0 && 7.8 >= 7.798. 下列哪个结果是TRUE?
A:isTRUE(!TRUE)
B:isTRUE(3)
C:!isTRUE(4 < 3)
D:!isTRUE(8 != 5)
E:isTRUE(NA)9. 下列哪个选项的结果为TRUE?
A:!identical(7, 7)
B:identical(4, 3.1)
C:identical(5 > 4, 3 < 3.1)
D:identical(‘hello’, ‘Hello’)10. xor(12,-1)的结果是什么?
11. 下列选项为FALSE的是哪个?
A:xor(!isTRUE(TRUE), 6 > -1)
B:xor(identical(xor, ‘xor’), 7 == 7.0)
C:xor(!!TRUE, !!FALSE)
D:xor(4 >= 9, 8 != 8.0)12. 请说明any()函数的作用?
13. 请说明all()函数的作用?
利用HMP文件遗传相似度
【功能】
利用HMP文件计算遗传相似度(genetic_similarity)。
数据中不能有NA。
【鸣谢】
四川农业大学 瞿静涛 算法思路
黑龙江农科院 曹士亮 测试
【更新历史】
2020年8月17日
- 增加了国内线路。
2020年5月6日
- 更换了计算逻辑,计算更快,但数据中不能有NA。
2020年4月18日
- 增加了自动去掉None数据的功能,避免程序出错。
- 结果自动命名为【原文件名_性状名】的形式。
【使用方法】
在Rstudio中运行下列代码。
海外:
source("https://aozhangchina.github.io/R/genetic_similarity/genetic_similarity.r") # 加载程序文件,需要联网国内:
source("https://dataholdcn.cn/R/genetic_similarity/genetic_similarity.r") # 加载程序文件,需要联网本页短链接:https://wp.me/p80aHo-8K


