R语言多元统计分析初探

# 读取多元统计分析数据到R

wine<-read.table("http://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data", sep=",")

# 绘制多元统计数据

# 矩阵散点图

# 一种常见的方法是使用散点图画出多元统计数据,展现出所有变量两两之间的散点图。

# 我们可以使用R中的“car”包里的“scatterplotMatrix()”函数来实现。

library(car)

scatterplotMatrix(wine[2:6])

# 组群标注数据点的散点图

plot(wine$V4,wine$V5)

text(wine$V4,wine$V5,wine$V1,cex=0.7,pos=4,col="red")

# 轮廓图?

# 轮廓图? 另一种非常有用的图表类型便是”轮廓图”,它通过绘制出每个变量在样本中的值,展示出每个变量的变化。

# 下文的“makeProfilePlot()”函数可以绘制出轮廓图。这个函数需要“RColorBrewer”库。

makeProfilePlot<-function(mylist,names){

require(RColorBrewer)

# find out how many variables we want to include

numvariables<-length(mylist)

# choose ‘numvariables‘ random colours

colours<-brewer.pal(numvariables,"Set1")

# find out the minimum and maximum values of the variables:

mymin<-1e+20

mymax<-1e-20

for(i in 1:numvariables){

vectori<-mylist[[i]]

mini<-min(vectori)

maxi<-max(vectori)

if(mini<mymin) {mymin<-mini}

if(maxi>mymax) {mymax<-maxi}

}

# plot the variables

for(i in 1:numvariables){

vectori<-mylist[[i]]

namei<-names[i]

colouri<-colours[i]

if(i == 1) {plot(vectori,col=colouri,type="l",ylim=c(mymin,mymax))}

else  {points(vectori,col=colouri,type="l")}

lastxval<-length(vectori)

lastyval<-vectori[length(vectori)]

text((lastxval-10),(lastyval),namei,col="black",cex=0.6)

}

}

# 例如,为了画出葡萄酒样本中前五种化学物质的轮廓图(他们存储在“wine”变量的V2,V2,V4,V5,V6列),我们输入:

library(RColorBrewer)

names<-c("V2","V3","V4","V5","V6")

mylist<-list(wine$V2,wine$V3,wine$V4,wine$V5,wine$V6)

makeProfilePlot(mylist,names)

# 计算多元统计数据的概要统计量

# 另一件事便是你可能会想计算你的多元统计数据集中每一个变量的概要统计量,像均值、标准偏差之类。

sapply(wine[,2:14],mean)

sapply(wine[,2:14],sd)

# 我们可以通过标准化来使数据看起来更有意义,以使我们能清楚的比较这些变量。我们需要便准化每一个变量以便使他们样本方差为1,样本均值为0.

# 每组的均值与方差

# 通常感兴趣于从一个特定样本群体去计算其均值和标准偏差,例如,计算每一个品种葡萄酒样本。葡萄酒品种被存储在“wine”变量的“V1”列中。

# 为了仅提取2号品种的数据,我们输入:

cultivar2wine<-wine[wine$V1==2,]

sapply(cultivar2wine[2:14],mean)

sapply(cultivar2wine[2:14],sd)

# 你也可以通过相似的方法计算1号品种样本,或者是3号品种样本的13种化学物质浓度的均值和标准偏差:

# 然而,为了方便起见,你也许想通过以下的“printMeanAndSdByGroup()”函数一次性输出数据集中分组数据的均值和标准偏差:

printMeanAndSdByGroup<-function(variables,groupvariable){

# find the names of the variables

variablenames<-c(names(groupvariable),names(as.data.frame(variables)))

# within each group, find the mean of each variable

groupvariable<-groupvariable[,1] #ensures groupvariable is not a list

means<-aggregate(as.matrix(variables)~groupvariable,FUN=mean)

names(means)<-variablenames

print(paste("Mean:"))

print(means)

# within each group, find the standard deviation of each variable:

sds<-aggregate(as.matrix(variables)~groupvariable,FUN=sd)

names(sds)<-variablenames

print(paste("Standard deviations:"))

print(sds)

# within each group, find the number of samples:

samplesizes<-aggregate(as.matrix(variables)~groupvariable,FUN=length)

names(samplesizes)<-variablenames

print(paste("Sample sizes:"))

print(samplesizes)

}

printMeanAndSdByGroup(wine[2:14],wine[1])

# 函数”printMeanAndSdByGroup()”将输出分组样本的数字。在本例中,我们可以看到品种1有59个样本,品种2有71个样本,品种3有48个样本。

## 变量的组间方差和组内方差

# 如果我们想计算特定变量的组内方差(例如,计算特定化学物质的浓度),我们可以使用下述的“calWithinGroupsVariance()”函数:

calcWithinGroupsVariance<-function(variable,groupvariable){

# find out how many values the group variable can take

groupvariable2<-as.factor(groupvariable[[1]])

levels<-levels(groupvariable2)

numlevels<-length(levels)

# get the mean and standard deviation for each group:

numtotal<-0

denomtotal<-0

for(i in 1:numlevels){

leveli<-levels[i]

levelidata<-variable[groupvariable==leveli,]

levelilength<-length(levelidata)

# get the mean and standard deviation for group i:

meani<-mean(levelidata)

sdi<-sd(levelidata)

numi<-(levelilength-1)*(sdi*sdi)

denomi<-levelilength

numtotal<-numtotal+numi

denomtotal<-denomtotal+denomi

}

# calculate the within-groups variance

Vw<-numtotal/(denomtotal-numlevels)

return(Vw)

}

# 例如,计算V2变量(第一种化学物质的浓度)的组内方差,我们输入:

calcWithinGroupsVariance(wine[2],wine[1]) # [1] 0.2620525

# 我们可以通过下述的“calcBetweenGroupsVariance()”函数来计算特定变量(如V2)的组间方差:

calcBetweenGroupsVariance <- function(variable,groupvariable) {

# find out how many values the group variable can take

groupvariable2 <- as.factor(groupvariable[[1]])

levels <- levels(groupvariable2)

numlevels <- length(levels)

# calculate the overall grand mean:

grandmean <- mean(variable[,1])

# get the mean and standard deviation for each group:

numtotal <- 0

denomtotal <- 0

for (i in 1:numlevels)

{

leveli <- levels[i]

levelidata <- variable[groupvariable==leveli,]

levelilength <- length(levelidata)

# get the mean and standard deviation for group i:

meani <- mean(levelidata)

sdi <- sd(levelidata)

numi <- levelilength * ((meani - grandmean)^2)

denomi <- levelilength

numtotal <- numtotal + numi

denomtotal <- denomtotal + denomi

}

# calculate the between-groups variance

Vb <- numtotal / (numlevels - 1)

Vb <- Vb[[1]]

return(Vb)

}

# 可以像这样使用它计算V2的组间方差:

calcBetweenGroupsVariance(wine[2],wine[1]) # [1] 35.39742

# 我们可以通过变量的组间方差除以组内方差计算“separation”。因此,这个通过V2计算的这个间隔是:

calcBetweenGroupsVariance(wine[2],wine[1])/calcWithinGroupsVariance(wine[2],wine[1])

# 如果我们想通过多元统计数据的所有变量计算出间隔,你可以使用下述的“calcSeparations()”:

calcSeparations<-function(variables,groupvariable){

# find out how many variables we have

variables<-as.data.frame(variables)

numvariables<-length(variables)

# find the variable names

variablenames<-colnames(variables)

# calculate the separation for each variable

for(i in 1:numvariables){

variablei<-variables[i]

variablename<-variablenames[i]

Vw<-calcWithinGroupsVariance(variablei,groupvariable)

Vb<-calcBetweenGroupsVariance(variablei,groupvariable)

sep<-Vb/Vw

print(paste("variable",variablename,"Vw=",Vw,"Vb=",Vb,"separation=",sep))

}

}

# 例如,计算每一个变量的13种化学物质浓度的间隔,我们输入:

calcSeparations(wine[2:14],wine[1])

# 因此,个体变量在组内(葡萄酒品种)的最大间隔是V2(间隔为233.0)。

# 正如我们将在下面讨论的,线性判别分析(LDA)的目的是寻找一个个体变量的线性组合将令组内(这里是品种)实现最大的间隔。

# 这里希望能够通过任何个体变量(暂时是V8的233.9)得到一个更好的间隔替代这个最优间隔。

时间: 2024-07-28 20:48:36

R语言多元统计分析初探的相关文章

R语言 多元线性回归分析

#线性模型中有关函数#基本函数 a<-lm(模型公式,数据源) #anova(a)计算方差分析表#coef(a)提取模型系数#devinace(a)计算残差平方和#formula(a)提取模型公式#plot(a)绘制模型诊断图#predict(a)用作预测#print(a)显示#residuals()计算残差#setp()逐步回归分析#summary()提取模型资料 #多元线性回归分析 #回归系数的估计 #显著性检验: 1回归系数的显著性检验 t检验 就是检验某个变量系数是否为0 2回归方程的显

ML—R常用多元统计分析包(持续更新中……)

基本的R包已经实现了传统多元统计的很多功能,然而CRNA的许多其它包提供了更深入的多元统计方法,下面要综述的包主要分为以下几个部分: 1) 多元数据可视化(Visualising multivariate data): 绘图方法: 基本画图函数(如:pairs().coplot())和lattice包里的画图函数(xyplot().splom())可以画成对列表的二维散点图,3维密度图.car包里的scatterplot.matrix()函数提供更强大的二维散点图的画法.cwhmisc包集合里的

SQL Server 2016将内置R语言?

(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:随着大数据成为一个BuzzWord,和大数据相关的技术也变得越来越火热,其中就包括R语言.而据说SQL Server 2016将会内置R语言支持? R语言作为一个存在很久的语言,在大数据热炒之后也被大家翻出来炒冷饭.微软为了其大数据战略,也不失时机的收购了R语言的开发商Revolution Analytics.这次收购带来的一个结果就是SQL Server 2016将会把R语言内置,也就是说可

R语言学习1

最开始在学校只使用过Matlab,后来在工作中与同事交流才接触到R语言存在. 在网上查询了下,R语言主要是用于统计分析,是一门解释性语言,性能吗不要太期望很高,但开源且有很多的工具包. 但在真正开始学习时,才发现网上的教程不全,只是少部分的知识点的介绍. 发现了以下不错的学习资源: 1.R语言教程:http://www.math.pku.edu.cn/teachers/lidf/docs/Rbook/html/_Rbook/intro.html 这个教程还是很全的.基本R语言的基础和使用都有介绍

R语言解读多元线性回归模型

转载:http://blog.fens.me/r-multi-linear-regression/ 前言 本文接上一篇R语言解读一元线性回归模型.在许多生活和工作的实际问题中,影响因变量的因素可能不止一个,比如对于知识水平越高的人,收入水平也越高,这样的一个结论.这其中可能包括了因为更好的家庭条件,所以有了更好的教育:因为在一线城市发展,所以有了更好的工作机会:所处的行业赶上了大的经济上行周期等.要想解读这些规律,是复杂的.多维度的,多元回归分析方法更适合解读生活的规律. 由于本文为非统计的专业

R语言使用二元回归将序数数据建模为多元GLM

用于分析序数数据的最常见模型是 逻辑模型 .本质上,您将结果视为连续潜在变量的分类表现.此结果的预测变量仅以一种方式对其产生影响,因此 为每个预测变量获得一个回归系数.但是该模型有几个截距,它们代表将变量切分以创建观察到的分类表现的点. 就像在普通回归模型中一样,每个预测变量都会以一种方式影响结果,这就是比例赔率假设或约束.或者,可以让每个预测变量在每个切入点对结果产生不同的影响. 如何使用单变量GLM软件对此建模?UCLA idre页面上有关于多元随机系数模型的文章.在这里很重要,因为他们使用

R语言统计分析-方差分析

R语言统计分析-方差分析 一.方差分析简单的例子 测试6中杀虫剂的效果,目标值为虫子个数,对方差进行分析. 1.导入数据 data(InsectSprays) 2.平方根转换,分析 aov.spray <- aov(sqrt(count) ~ spray, data = InsectSprays) aov()左边为左边相应变量,右边预测变量. 等价于 > aov.spray <- aov(sqrt(InsectSprays$count) ~ InsectSprays$spray) 知道编

R语言统计分析应用与SAS、SPSS的比较

能够用来做统计分析的软件和程序很多,目前应用比较广泛的包括:SPSS, SAS.R语言,Matlab,S-PLUS,S-Miner等.下面我们来看一下各应用的特点: SPSS: 最简单的,都是菜单操作,不过不利于二次程序开发. SAS: 需要购买,该软件录入语言要非常精确,不能出错,难操作. R语言:免费软件,可以菜单操作,不过一般要编程的,二次程序开发. Matlab:基本是程序操作,和R语言差不多,不过功能比较强大. S-PLUS: 需要购买,基本也是菜单操作,和SPSS差不多. R与SPS

多元线性回归公式推导及R语言实现

多元线性回归 多元线性回归模型 实际中有很多问题是一个因变量与多个自变量成线性相关,我们可以用一个多元线性回归方程来表示. 为了方便计算,我们将上式写成矩阵形式: Y = XW 假设自变量维度为N W为自变量的系数,下标0 - N X为自变量向量或矩阵,X维度为N,为了能和W0对应,X需要在第一行插入一个全是1的列. Y为因变量 那么问题就转变成,已知样本X矩阵以及对应的因变量Y的值,求出满足方程的W,一般不存在一个W是整个样本都能满足方程,毕竟现实中的样本有很多噪声.最一般的求解W的方式是最小