20180316(从有道迁移)
基本统计分析
-
描述性统计分析
- 常用库:
- 基础方法summary;
- summary()函数提供了最小值、最大值、四分位数和数值型变量的均值,以及因子向量和逻辑型向量的频数统计
- 可以使用apply()函数或sapply()函数计算所选择的任意数据集的描述性统计量
- sapply()函数,其使用格式为
sapply(x,FUN,otions)
- x是数据框(或矩阵)
- FUN为一个任意的函数, 可以插入的典型函数有mean、sd、var、min、max、median、length、range和quantile。
- 如果指定了options,它们将被传递给FUN
- 函数fivenum()可返回图基五数总括(Tukey’s five-number summary,即最小值、下四分位数、中位数、上四分位数和最大值)
- Hmisc包中的describe()函数可返回变量和观测的数量、缺失值和唯一值的数目、平均值、分位数,以及五个最大的值和五个最小的值
- pastecs包中有一个名为stat.desc()的函数,它可以计算种类繁多的描述性统计量。
- 使用格式:
stat.desc(x,basic=TRUE,desc=TRUE,norm=FALSE,p=0.95)
- x是一个数据框或时间序列
- 若basic=TRUE(默认值),则计算其中所有值、空值、缺失值的数量,以及最小值、最大值、值域,还有总和
- 若desc=TRUE(同样也是默认值),则计算中位数、平均数、平均数的标准误、平均数置信度为95%的置信区间、方差、标准差以及变异系数
- 若norm=TRUE(不是默认的),则返回正态分布统计量,包括偏度和峰度(以及它们的统计显著程度)和Shapiro–Wilk正态检验结果
- 使用格式:
- psych包拥有一个名为describe()的函数,它可以计算非缺失值的数量、平均数、标准差、中位数、截尾均值、绝对中位差、最小值、最大值、值域、偏度、峰度和平均值的标准误差
- 基础方法summary;
- 分组计算描述性统计量
在比较多组个体或观测时,关注的焦点经常是各组的描述性统计信息,而不是样本整体的描述性统计信息
-
可以使用aggregate()函数来分组获取描述性统计量
- 如果有多个分组变量,可以使用by=list(name1=groupvar1, name2=groupvar2, ... , groupvarN)这样的语句
aggregate(mtcars[vars],by=list(am=mtcars$am),mean) aggregate(mtcars[vars],by=list(am=mtcars$am),sd)
-
aggregate()仅允许在每次调用中使用平均数、标准差这样的单返回值函数,无法一次返回若干个统计量。要完成这项任务,可以使用by()函数。格式:
by(data,INDICES,FUN)
- data是一个数据框或矩阵
- INDICES是一个因子或因子组成的列表,定义了分组
- FUN是任意函数
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, stdev=s, skew=skew, kurtosis=kurt)) } dstats <- function(x)sapply(x, mystats) myvars <- c("mpg", "hp", "wt") by(mtcars[myvars], mtcars$am, dstats)
-
doBy包中summaryBy()函数的使用格式为:
summaryBy(formula,data=dataframe,FUN=function)
,其中formula接受以下的格式:var1+var2+var3+...+varN ~ group1+group2+...+groupNsummaryBy(mpg+hp+wt~am,data=mtcars,FUN=mystats)
psych包中的describe.by()函数可计算和describe相同的描述性统计量,只是按照一个或多个分组变量分层,
describe.by(mtcars[vars],mtcars$am)
,describe.by()函数不允许指定任意函数,若存在一个以上的分组变量,你可以使用list(groupvar1, groupvar2, ... , groupvarN)来表示它们。但这仅在分组变量交叉后不出现空白单元时有效.-
reshape包灵活地按组导出描述性统计量,步骤
- 融合数据框:
dfm <- melt(dataframe,measure.vars=y,id.vars=g)
,其中的dataframe包含着数据,y是一个向量,指明了要进行概述的数值型变量(默认使用所有变量),而g是由一个或多个分组变量组成的向量 - 重铸数据: cast(dfm,groupvar1+...+groupvarN+ variable ~ .,FUN)
library(reshape) dstats <- function(x)(c(n=length(x), mean=mean(x), sd=sd(x))) dfm <- melt(mtcars, measure.vars=c("mpg", "hp", "wt"), id.vars=c("am", "cyl")) cast(dfm, am + cyl + variable ~ ., dstats)
- 融合数据框:
- 常用库:
-
类别型变量的频数表和列联表
==https://en.wikipedia.org/wiki/Contingency_table==
-
生成频数表函数,用于创建和处理列联表的函数如下
函 数 描 述 table(var1, var2, …, varN) 使用 N 个类别型变量(因子)创建一个 N 维列联表 xtabs(formula, data) 根据一个公式和一个矩阵或数据框创建一个 N 维列联表 prop.table(table, margins) 依margins定义的边际列表将表中条目表示为分数形式 margin.table(table, margins) 依margins定义的边际列表计算表中条目的和 addmargins(table, margins) 将概述边margins(默认是求和结果)放入表中 ftable(table) 创建一个紧凑的“平铺”式列联表
-
一维列联表
- 可以使用table()函数生成简单的频数统计表
mytable <- table(Arthritis$Improved) ## 结果 ## None Some Marked ## 42 14 28
- 可以用prop.table()将这些频数转化为比例值
prop.table(mytable) ## 结果 ## None Some Marked ## 0.5000000 0.1666667 0.3333333
- 可以使用table()函数生成简单的频数统计表
-
二维列联表
对于二维列联表,table()函数的使用格式为:
mytable <- table(A,B)
, 其中,A是行变量,B是列变量。-
对于xtabs()函数可使用公式风格的输入创建列联表,格式为:
mytable <- xtabs(~ A+B,data=mydata)
,mydata是一个矩阵或数据框。要进行交叉分类的变量应出现在公式的右侧(即~符号的右方),以+作为分隔符。若某个变量写在公式的左侧,则其为一个频数向量(在数据已经被表格化时很有用)。mytable <- xtabs(~ Treatment + Improved,data=Arthritis)
-
margin.table()和prop.table()函数分别生成边际频数和比例
## 下标1指代table()语句中的第一个变量。 margin.table(mytable,1) #row sums ## 下标2指代table()语句中的第二个变量 margin.table(mytable, 2) # column sums prop.table(mytable) # cell proportions prop.table(mytable, 1) # row proportions prop.table(mytable, 2) # column proportions
-
使用addmargins()函数为这些表格添加边际和
## 在使用addmargins()时,默认行为是为表中所有的变量创建边际和 addmargins(mytable) # add row and column sums to table addmargins(prop.table(mytable)) ## 仅添加了各行的和 addmargins(prop.table(mytable, 1), 2) ## 仅添加了各列的和 addmargins(prop.table(mytable, 2), 1)
==table()函数默认忽略缺失值(NA)。要在频数统计中将NA视为一个有效的类别,请设定参数useNA="ifany"。==
-
使用gmodels包中的CrossTable()函数也可以创建二维列联表
- CrossTable()函数有很多选项,可以做许多事情:计算(行、列、单元格)的百分比;指定小数位数;进行卡方、Fisher和McNemar独立性检验;计算期望和(皮尔逊、标准化、调整的标准化)残差;将缺失值作为一种有效值;进行行和列标题的标注;生成SAS或SPSS风格的输出。参阅help(CrossTable)以了解详情
library(gmodels) CrossTable(Arthritis$Treatment,Arthritis$Improved)
-
多维列联表
- table()和xtabs()都可以基于三个或更多的类别型变量生成多维列联表。margin.table()、prop.table()和addmargins()函数可以自然地推广到高于二维的情况。另外,ftable()函数可以以一种紧凑而吸引人的方式输出多维列联表
-
独立性检验
-
卡方独立性检验
- 使用chisq.test()函数对二维表的行变量和列变量进行卡方独立性检验
- 这里的p值表示从总体中抽取的样本行变量与列变量是相互独立的概率
mytable <- xtabs(~Treatment+Improved,data=Arthritis) chisq.test(mytable) ## result 治疗情况和改善情况不独立 Pearson's Chi-squared test data: mytable X-squared = 13.055, df = 2, p-value = 0.001463 mytable2 <- xtabs(~Sex+Improved,data=Arthritis) chisq.test(mytable2) ## result 性别和改善情况独立 Pearson's Chi-squared test data: mytable2 X-squared = 4.8407, df = 2, p-value = 0.08889 Warning message: In chisq.test(mytable2) : Chi-squared近似算法有可能不准 ## 产生警告信息的原因是,mytable2中的6个单元格之一(男性 - 一定程度上的改善)有一个小于5的值,这可能会使卡方近似无效
-
Fisher精确检验
- 使用fisher.test()函数进行Fisher精确检验。
- Fisher精确检验的原假设是:边界固定的列联表中行和列是相互独立的。
- fisher.test()函数可以在任意行列数大于等于2的二维列联表上使用,但不能用于2×2的列联表
- 调用格式为fisher.test(mytable),其中的mytable是一个二维列联表
fisher.test(mytable) ## result Fisher's Exact Test for Count Data data: mytable p-value = 0.001393 alternative hypothesis: two.sided
-
Cochran-Mantel–Haenszel检验
- mantelhaen.test()函数可用来进行Cochran—Mantel—Haenszel卡方检验.
- 其原假设是,两个名义变量在第三个变量的每一层中都是条件独立的。
- 下列代码可以检验治疗情况和改善情况在性别的每一水平下是否独立。此检验假设不存在三阶交互作用(治疗情况×改善情况×性别)
mytable3 <- xtabs(~Treatment+Improved+Sex,data=Arthritis) mantelhaen.test(mytable3) ## result 结果表明,患者接受的治疗与得到的改善在性别的每一水平下并不独立 ## 即,分性别来看,用药治疗的患者较接受安慰剂的患者有了更多的改善 Cochran-Mantel-Haenszel test data: mytable3 Cochran-Mantel-Haenszel M^2 = 14.632, df = 2, p-value = 0.0006647
-
关联资料:
- ==https://zh.wikipedia.org/wiki/%E5%8D%A1%E6%96%B9%E6%A3%80%E9%AA%8C==
- ==http://wiki.mbalib.com/wiki/%E5%8D%A1%E6%96%B9%E6%A3%80%E9%AA%8C==
-
-
相关性的度量
显著性检验评估了是否存在充分的证据以拒绝变量间相互独立的原假设。如果可以拒绝原假设,那么自然而然地转向用以衡量相关性强弱的相关性度量
-
vcd包中的assocstats()函数可以用来计算二维列联表的phi系数、列联系数和Cramer’s V系数
library(vcd) assocstats(mytable) X^2 df P(> X^2) Likelihood Ratio 13.530 2 0.0011536 Pearson 13.055 2 0.0014626 Phi-Coefficient : NA Contingency Coeff.: 0.367 Cramer's V : 0.394 ## 总体来说,较大的值意味着较强的相关性
-
相关资料
- ==https://zh.wikipedia.org/wiki/Phi%E7%9B%B8%E9%97%9C%E4%BF%82%E6%95%B8==
- ==https://en.wikipedia.org/wiki/Cram%C3%A9r%27s_V==
-
-
结果的可视化
- ca包中的对应分析函数允许使用多种几何表示可视地探索列联表中行和列之间的关系
-
将表转换为扁平格式
## 可以使用以下代码提供的函数将R中的表转换回扁平的数据格式 table2falt <- function(mytable){ df <- as.data.frame(table) rows <- dim(df)[1] cols <- dim(df)[2] x <- NULL for (i in 1:rows){ for (j in 1:df$Freq[i]){ row <- df[i,c(1:(cols-1))] x <- rbind(x,row) } } row.names[x] <- c(1:dim(x)[1]) return(x) }
-
相关
- 相关系数可以用来描述定量变量之间的关系。
- 相关系数的符号
(±)
表明关系的方向(正相关或负相关),其值的大小表示关系的强弱程度(完全不相关时为0,完全相关时为1)。
-
相关的类型
-
Pearson、Spearman和Kendall相关
Pearson积差相关系数衡量了两个定量变量之间的线性相关程度。
Spearman等级相关系数则衡量分级定序变量之间的相关程度。
Kendall’s Tau相关系数也是一种非参数的等级相关度量
-
cor()函数可以计算这三种相关系数,而cov()函数可用来计算协方差,以下为相关系数有关的参数:
参 数 描 述 x 矩阵或数据框 use 指定缺失数据的处理方式。可选的方式为all.obs(假设不存在缺失数据——遇到缺失数据时将报错)、everything(遇到缺失数据时,相关系数的计算结果将被设为missing)、complete.obs(行删除)以及 pairwise.complete.obs(成对删除,pairwise deletion)默认参数为use="everything" method 指定相关系数的类型。可选类型为pearson、spearman或kendall 默认参数为method="pearson" -
示例
states <- state.x77[,1:6] ## 计算Pearson积差相关系数 cor(states) Population Income Illiteracy Life Exp Murder Population 1.00000000 0.2082276 0.1076224 -0.06805195 0.3436428 Income 0.20822756 1.0000000 -0.4370752 0.34025534 -0.2300776 Illiteracy 0.10762237 -0.4370752 1.0000000 -0.58847793 0.7029752 Life Exp -0.06805195 0.3402553 -0.5884779 1.00000000 -0.7808458 Murder 0.34364275 -0.2300776 0.7029752 -0.78084575 1.0000000 HS Grad -0.09848975 0.6199323 -0.6571886 0.58221620 -0.4879710 HS Grad Population -0.09848975 Income 0.61993232 Illiteracy -0.65718861 Life Exp 0.58221620 Murder -0.48797102 HS Grad 1.00000000 ## 计算方差和协方差 cov(states) Population Income Illiteracy Life Exp Murder Population 19931683.7588 571229.7796 292.8679592 -407.8424612 5663.523714 Income 571229.7796 377573.3061 -163.7020408 280.6631837 -521.894286 Illiteracy 292.8680 -163.7020 0.3715306 -0.4815122 1.581776 Life Exp -407.8425 280.6632 -0.4815122 1.8020204 -3.869480 Murder 5663.5237 -521.8943 1.5817755 -3.8694804 13.627465 HS Grad -3551.5096 3076.7690 -3.2354694 6.3126849 -14.549616 HS Grad Population -3551.509551 Income 3076.768980 Illiteracy -3.235469 Life Exp 6.312685 Murder -14.549616 HS Grad 65.237894 ## 计算Spearman等级相关系数 cor(states,method="spearman") Population Income Illiteracy Life Exp Murder HS Grad Population 1.0000000 0.1246098 0.3130496 -0.1040171 0.3457401 -0.3833649 Income 0.1246098 1.0000000 -0.3145948 0.3241050 -0.2174623 0.5104809 Illiteracy 0.3130496 -0.3145948 1.0000000 -0.5553735 0.6723592 -0.6545396 Life Exp -0.1040171 0.3241050 -0.5553735 1.0000000 -0.7802406 0.5239410 Murder 0.3457401 -0.2174623 0.6723592 -0.7802406 1.0000000 -0.4367330 HS Grad -0.3833649 0.5104809 -0.6545396 0.5239410 -0.4367330 1.0000000
-
偏相关
- 偏相关是指在控制一个或多个定量变量时,另外两个定量变量之间的相互关系。
- 可以使用ggm包中的pcor()函数计算偏相关系数,格式
pcor(u,S)
,其中:- u是一个数值向量,前两个数值表示要计算相关系数的变量下标,其余的数值为条件变量(即要排除影响的变量)的下标。
- S为变量的协方差阵
- 示例
library(ggm) ## 在控制了收入、文盲率和高中毕业率时,人口和谋杀率的偏相关系数 pcor(c(1,5,2,3,6),cov(states))
-
其他类型的相关
- polycor包中的hetcor()函数可以计算一种混合的相关矩阵,其中包括数值型变量的Pearson积差相关系数、数值型变量和有序变量之间的多系列相关系数、有序变量之间的多分格相关系数以及二分变量之间的四分相关系数
-
-
相关性的显著性检验
在计算好相关系数以后,可以进行统计显著性检验。常用的原假设为变量间不相关(即总体的相关系数为0)。
-
可以使用默认包的cor.test()函数对单个的Pearson、Spearman和Kendall相关系数进行检验。简化后的使用格式为:cor.test(x,y,alternative=,method=)
- x和y为要检验相关性的变量
- alternative则用来指定进行双侧检验或单侧检验(取值为"two.side"、"less"或"greater")。当研究的假设为总体的相关系数小于0时,请使用alternative="less"。在研究的假设为总体的相关系数大于0时,应使用alternative="greater"
- method用以指定要计算的相关类型("pearson"、"kendall"或"spearman")。
-- 示例
## 检验预期寿命和谋杀率的Pearson相关系数为0的原假设 ## 假设总体的相关度为0,则预计在一千万次中只会有少于一次的机会见到0.703这样大的样本相关度(即p = 1.258e08)。由于这种情况几乎不可能发生,所以你可以拒绝原假设,从而支持了要研究的猜想,即预期寿命和谋杀率之间的总体相关度不为0 cor.test(states[,3],states[,5]) Pearson's product-moment correlation data: states[, 3] and states[, 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()函数可以为Pearson、Spearman或Kendall相关计算相关矩阵和显著性水平,格式corr.test(x,use=,method=)
- 参数use=的取值可为"pairwise"或"complete"(分别表示对缺失值执行成对删除或行删除)。
- 参数method=的取值可为"pearson"(默认值)、"spearman"或"kendall"。
corr.test(states,use="complete") Call:corr.test(x = states, use = "complete") Correlation matrix Population Income Illiteracy Life Exp Murder HS Grad Population 1.00 0.21 0.11 -0.07 0.34 -0.10 Income 0.21 1.00 -0.44 0.34 -0.23 0.62 Illiteracy 0.11 -0.44 1.00 -0.59 0.70 -0.66 Life Exp -0.07 0.34 -0.59 1.00 -0.78 0.58 Murder 0.34 -0.23 0.70 -0.78 1.00 -0.49 HS Grad -0.10 0.62 -0.66 0.58 -0.49 1.00 Sample Size [1] 50 Probability values (Entries above the diagonal are adjusted for multiple tests.) Population Income Illiteracy Life Exp Murder HS Grad Population 0.00 0.59 1.00 1.0 0.10 1 Income 0.15 0.00 0.01 0.1 0.54 0 Illiteracy 0.46 0.00 0.00 0.0 0.00 0 Life Exp 0.64 0.02 0.00 0.0 0.00 0 Murder 0.01 0.11 0.00 0.0 0.00 0 HS Grad 0.50 0.00 0.00 0.0 0.00 0 To see confidence intervals of the correlations, print with the short=FALSE option
-
其他显著性校验
- 在多元正态性的假设下,ggm包中的pcor.test()函数可以用来检验在控制一个或多个额外变量时两个变量之间的条件独立性。
- psych包中的r.test()函数提供了多种实用的显著性检验方法。此函数可用来检验:
- 某种相关系数的显著性;
- 两个独立相关系数的差异是否显著;
- 两个基于一个共享变量得到的非独立相关系数的差异是否显著;
- 两个基于完全不同的变量得到的非独立相关系数的差异是否显著。
-
t校验
-
独立样本的t校验
- 一个针对两组的独立样本t检验可以用于检验两个总体的均值相等的假设。这里假设两组数据是独立的,并且是从正态总体中抽得。检验的调用格式为:
- ```t.test( y ~ x,data)``,其中的y是一个数值型变量,x是一个二分变量。可选参数data的取值为一个包含了这些变量的矩阵或数据框。
-
t.test(y1,ye)
,其中的y1和y2为数值型向量(即各组的结果变量)。 - 此方法的t检验默认假定方差不相等,并使用Welsh的修正自由度。可以添加一个参数var.equal=TRUE以假定方差相等,并使用合并方差估计。
- 默认的备择假设是双侧的(即均值不相等,但大小的方向不确定)。可以添加一个参数alternative="less"或alternative="greater"来进行有方向的检验
- 示例:
## 一个假设方差不等的双侧检验,比较了南方(group 1)和非南方(group 0)各州的监禁概率 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 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 < .001)。
- 一个针对两组的独立样本t检验可以用于检验两个总体的均值相等的假设。这里假设两组数据是独立的,并且是从正态总体中抽得。检验的调用格式为:
-
非独立样本的t检验
- 在两组的观测之间相关时,你获得的是一个非独立组设计(dependent groups design)。前—后测设计(pre-post design)或重复测量设计(repeated measures design)同样也会产生非独立的组
- 非独立样本的t检验假定组间的差异呈正态分布。对于本例,检验的调用格式为:
-
t.test(y1,y2,paired=TRUE)
,其中y1和y2为两个非独立组的数值向量
-
- 示例
sapply(UScrime[c("U1","U2")],function(x){c(mean=mean(x),sd=sd(x))}) with(UScrime,t.test(U1,U2,paired=TRUE)) Paired t-test data: U1 and U2 t = 32.407, df = 46, p-value < 2.2e-16 alternative hypothesis: true difference in means is not equal to 0 95 percent confidence interval: 57.67003 65.30870 sample estimates: mean of the differences 61.48936 ## 差异的均值(61.5)足够大,可以保证拒绝年长和年轻男性的平均失业率相同的假设。年轻男性的失业率更高。事实上,若总体均值相等,获取一个差异如此大的样本的概率小于0.000 000 000 000 000 22(即2.2e16)
-
多于两组的t校验情况
- 如果想在多于两个的组之间进行比。如果能够假设数据是从正态总体中独立抽样而得的,可以使用方差分析(ANOVA)。ANOVA是一套覆盖了许多实验设计和准实验设计的综合方法
-
-
组间差异的非参数检验
如果数据无法满足t检验或ANOVA的参数假设,可以转而使用非参数方法
==当t检验的假设合理时,参数检验的功效更强(更容易发现存在的差异)。而非参数检验在假设非常不合理时(如对于等级有序数据)更适用==
-
两组的比较
- 若两组数据独立,可以使用Wilcoxon秩和检验(更广为人知的名字是Mann–Whitney U检验)来评估观测是否是从相同的概率分布中抽得的(即,在一个总体中获得更高得分的概率是否比另一个总体要大)
- 格式:
wilcoxo.test(y ~ x,data)
,其中的y是数值型变量,而x是一个二分变量。 - 调用格式或为:
wilcoxo.test(y1,y2)
,其中的y1和y2为各组的结果变量。 - 可选参数data的取值为一个包含了这些变量的矩阵或数据框。
- 默认进行一个双侧检验。可以添加参数exact来进行精确检验,指定alternative="less"或alternative="greater"进行有方向的检验
- 示例。。。。
-
多于两组的比较
- 单向设计(one-way design),可以使用参数或非参数的方法来解决这个问题。
- 如果无法满足ANOVA设计的假设,那么可以使用非参数方法来评估组间的差异。如果各组独立,则Kruskal—Wallis检验将是一种实用的方法。如果各组不独立(如重复测量设计或随机区组设计),那么Friedman检验会更合适。
- Kruskal–Wallis检验的调用格式为:
kruskal.test(y ~ A,data)
,其中的y是一个数值型结果变量,A是一个拥有两个或更多水平的分组变量(grouping variable)。
(若有两个水平,则它与Mann–Whitney U检验等价。) - Friedman检验的调用格式为:
friedman.test(y ~ A|B, data)
,其中的y是数值型结果变量,A是一个分组变量,而B是一个用以认定匹配观测的区组变量(blocking
variable) - 一种更为优雅的方法是在控制犯第一类错误的概率(发现一个事实上并不存在的差异的概率)的前提下,执行可以同步进行的多组比较,这样可以直接完成所有组之间的成对比较。npmc包提供了所需要的非参数多组比较程序
-