初见R语言(2)

前言

本篇章主要围绕R语言,但较为杂乱,可能还含有以下内容

  • 概率统计
  • 机器学习

目前笔者暂无多余精力整理,读者请酌情阅读

R绘图(ggplot2库)

::: align-center
ggplot(data) + aes(x, y) + geom() + theme()

:::

  • data:绘图数据集
  • aes(x,y,color):美学映射,即数据集到图像横纵轴的映射,color项传入一个向量决定颜色
  • geom:需要绘制图像的类型,可选
    • geom_point:散点图
    • geom_line:线状图
    • geom_histogram:直方图
    • geom_boxplot:箱图
    • geom_density:密度图(数据密度)
  • theme:主题,不做概述

其他

  • labs(title, x, y):定义图像的大标题,x轴描述和y轴描述,传入字符串
  • scale_color_manual(values)和scale_fill_manual(values):手动定义填充颜色集,传入向量(内部为颜色字符串)
  • facet wrap() and facet grid(): 用于“分面”作图(见下)

实战

直方图

情景:画出mtcars数据集中不同车型的每加仑可行驶里程数(miles per gallon)
R内置直方图

R 复制代码
# 载入数据集
data ( mtcars )

# 画图
# breaks为分组方式,可取数字或字符串
# 当取字符串时,有"Sturges","Scott", "FD",分别对应根据数据大小分组/根据Scott公式计算分组,使用近似正态分布的数据/使用FD公式计算分组,适用于有偏分布或有离群值的数据
# 当取数字时,即人为规定将数据分为指定个组
hist (
  mtcars$mpg, 
  col =" lightblue ", 
  breaks =10 ,
  main =" Histogram of Miles Per Gallon ",
  xlab =" Miles Per Gallon " , ylab =" Frequency ", 
  border =" black "
)

ggplot2

复制代码
library ( ggplot2 )

# 这里的bin和上面的breaks类似
ggplot (data = mtcars , aes (x = mpg)) +
geom_histogram (
  bins =10,
  fill =" lightblue ",
  color =" black "
) +
labs ( 
  title =" Distribution of Miles Per Gallon ",
   x =" Miles Per Gallon" , y =" Frequency "
) +
theme_classic ()

箱线图

首先是箱线图的介绍
箱图介绍.png

  • “箱”(Box):即四分位数范围Q_3-Q_1,对应25%-75%,此部分描述的是位于中间50%的数据 Q_1=X_{\lfloor \frac{n+1}{4}\rfloor},Q_3=X_{\lfloor{\frac{3(n+1)}{4}}\rfloor}
  • 中位数(Median):不多解释,可反映数据的“平均”趋势
  • 上下边缘组成的“触须”(Whisker):上边缘和下边缘分别对应上/下四分位数\pm四分数范围\times 1.5
  • 离群值(Outliers):在“触须”上下的值

R内置箱线图

R 复制代码
# 加载数据集
data ( mtcars )

# 绘图
# 第一个参数传入公式 绘图变量 ~ 分类变量(factor)
# 这里绘图变量选定为上面的miles per gallon,同时使用as.factor将数据集中的cyl转换为分类变量
boxplot (
  mpg ~ as.factor ( cyl ) ,
  data = mtcars , 
  col =" lightblue ",
  main =" Miles Per Gallon by Number of Cylinders ",
  xlab =" Number of Cylinders ", ylab =" Miles Per Gallon "
)

ggplot2

R 复制代码
library ( ggplot2 )

# Create a box plot using ggplot2
ggplot (
  data = mtcars , 
  aes (x = as.factor ( cyl ), y = mpg , fill = as.factor ( cyl ))
) +
geom_boxplot () +
labs (
  title =" Miles Per Gallon by Number of Cylinders ",
  x =" Number of Cylinders " , y =" Miles Per Gallon"
) + 
theme_classic () + 
scale_fill_manual ( values =c (" lightblue ", " lightgreen ", "lightcoral ") )

在实际处理数据时,我们通常会遇到数据量纲不统一,个别数据缺失或异常等问题,通常我们会使用箱线图来识别离群的数据

密度图

简介

此绘图方式可以绘制出连续型随机变量的概率密度函数(PDF),在概率论中,(单变量)连续型随机变量的概率分布函数(CDF)F(x)与概率密度函数的关系为
::: align-center
F(x)=\int_{-\infty}^{x}f(x)dx

:::
通常f(x)没有解析解,故绘图困难,要从数据中估计f(x)的大致形状,一种经典算法是核密度估计(Kernal Density Estimate, KDE)

粗略阐述KDE

KDE是机器学习中的经典算法,假设随机变量X的概率分布函数为F(x),因为概率密度函数f(x)是概率分布函数F(x)的导数,那么由导数定义有
::: align-center
f(x)=\lim_{h\to 0}\frac{F(x+h)-F(x-h)}{2h}

:::
现在我们假设要求x处的密度函数值,根据上面的思想,可取邻域[x-h,x+h],当h大于0且足够小时,我们便能把此邻域的密度函数值当做此点的密度函数值
::: align-center
\hat{f(x)}=\frac{1}{2h}\lim_{h\to 0}\frac{N_{x_i\in[x-h,x+h]}}{N_{total}}

:::
其中N_{x_i\in[x-h,x+h]}是该邻域中样本点数量,N_{total}是样本集总数量
由此可见,h的选择非常重要,因为如果h太大则违背了h\to 0,h太小那么用于估计f(x)的样本点会很少,由于我们只拥有有限个样本点故h也不能太小,此时

::: align-center
\hat{f(x)}=\frac{1}{2hN_{total}}\sum_{i=x-h}^{i=x+h}x_i=\frac{1}{2hN_{total}}\sum_{i}\frac{|x-x_i|}{h}

:::

此外还存在一个严重问题:那就是概率密度函数依然不够平滑,虽然我们得到了f(x)的估计,但这些估计终究估计的是某一个点的值而不是函数任意部分的值,且按照概率论,单变量时概率密度函数在[-\infty,\infty]上的积分应为1,而此时很显然我们是无法满足这个要求的,因为我们的估计都是离散的,又怎能进行积分(连续求和)呢

所以此时我们需要假设存在已知的概率密度函数K(x),使\hat{f(x)}=\frac{1}{2hN_{total}}\sum_{i}K(\frac{|x-x_i|}{h})
此时
\begin{aligned} &\int_{-\infty}^{\infty}\frac{1}{2hN_{total}}\sum_{i}K(\frac{|x-x_i|}{h})dx\\ &=\int_{-\infty}^{\infty}\frac{1}{2N_{total}}\sum_{i}K(t)dt\\ &=\frac{1}{2}\int_{-\infty}^{\infty}K(t)dt \end{aligned}
因为K(x)是已知的概率密度函数,它的积分一定为1,作简单变换让其积分为2即可满足让上式的积分为1

几个概念

  • x_i:已观测点(或先验点)Observed data point
  • n:总观测数 Total number of observation
  • K(x):核函数 Kernel Function
  • h:带宽 Bandiwidth

R中的密度图

继续回到R语言,简要介绍如何绘制密度图

R内置

R 复制代码
# 载入数据集
data ( mtcars )

# 可用density()函数估计概率密度函数
# lwd: Line Width 线粗细
plot (
  density ( mtcars$mpg ) ,
  col =" blue ", 
  lwd =2 ,
  main =" Density Plot of Miles Per Gallon ",
  xlab =" Miles Per Gallon " , ylab =" Density "
)

ggplot2

R 复制代码
library ( ggplot2 )

# Create a density plot using ggplot2
ggplot (
  data = mtcars , 
  aes ( x = mpg )
) +
geom_density ( 
  fill =" lightblue ", 
  color =" black ", 
  alpha =0.5
) +
labs ( 
  title =" Kernel Density Estimate of Miles Per Gallon ",
  x =" Miles Per Gallon ", y =" Density "
) +
theme_classic ()

茎叶图

茎叶图是一种显示数值分布的图,它的思路是将数按位数进行比较,将数的大小基本不变或变化不大的位作为主干(茎),将变化的位的数作为分支(叶),列在主干的后面,这样就可以清楚地看到每个主干后面的几个数,每个数具体是多少
茎叶图.jpg
例如:数据为23,25,27,32,35
则茎叶图为:
2 | 3 5 7
3 | 2 5

下面介绍在R中如何绘制茎叶图

R 复制代码
# 数据集
data <- c (23 , 25 , 27 , 32 , 35 , 40 , 42 , 45 , 47 , 50 , 53 , 55)

# 添加标题并绘图
cat (" Stem - and - Leaf Plot :\ n ")
stem ( data )

ggplot2分面作图

ggplot2支持“分面作图”,这里的“分面”指的是一页多图,而不是一图多“面”

缠绕分面 facet_wrap

此方法下对数据只能用一个标准分类,分类后的数据绘制出的图像将从左到右,从上到下按照“缠绕”顺序进行排列
使用方法

R 复制代码
+ facet_wrap(~ 分类变量)

e.g. 一个分类变量为
::: align-center
c("Fair", "Good", "Very Good", "Premium", "Ideal")

:::
则图会为这样
ggplot2分面绘图1.jpg

网格分面 facet_grid

按照两个标准对数据分类
使用方法

R 复制代码
+ facet_grid(纵列分类变量 ~ 横列分类变量)

e.g 新增一个分类变量
::: align-center
c("D", "E", "F", "H", "I", "J")

:::
为纵列分类变量,则图会变为
ggplot2分面绘图2.jpg

抽样 Sampling

概念回顾

  • 总体(Population):包含了所有可能的观测值或个体
  • 样本(Sample):总体中选取的一部分,目的是代表总体,使我们能够通过研究样本来了解和推断总体特征。样本的选择通常基于随机性以确保其代表性

抽样方法

  • 简单随机抽样(simple random sampling, SRS):不多解释
  • 分层抽样(stratified sampling):先按照某种规则把总体划分为不同的层,然后在层内用其他方法抽样,特别地,当各层使用SRS时称为分层随机抽样
  • 整群抽样(cluster sampling):先把总体中的个体划分为称作的单个组,然后以群为单位抽取一个简单随机样本
  • 系统抽样(systematic sampling):先将总体中的抽样单元按某种次序排列,在规定范围内随机抽取一个初始单元,然后按事先规定的规则抽取其他单元
  • 方便抽样(convenience sampling):为配合研究主题而由调查者于特定的条件(时间、地点等)随意选择样本(比如询问目击者)的非概率抽样方法

R中的抽样

此部分暂未更新完全

R 复制代码
# 假设总体是1到100这100个数
population <- 1:100
# 进行不放回随机抽样10次
sample_data <- sample ( population , size = 10 , replace = FALSE )

# 打印
print ( sample_data )

期望 Expectation

概念回顾

对于离散型随机变量
::: align-center
E[X]=\sum_i x_iP(X=x_i)

:::
对于连续型随机变量,建设其概率密度函数为f(x)
::: align-center
E[x]=\int_{-\infty}^{\infty}xf(x)dx

:::
期望可以进行线性运算
::: align-center
E[aX+bY]=aE[X]+bE[Y]

:::

R中的期望

粗略介绍蒙特卡洛方法

在面对连续型随机变量时,通常难以找到\int_{-\infty}^{\infty}xf(x)dx的解析解,故我们可以使用蒙特卡洛方法,通过随机抽样来获得期望的估计
::: align-center
E[X]\approx\frac{1}{N}\sum_{i=1}^{N}X_i

:::
其中

  • N:抽样次数
  • X_i:抽样结果

根据大数定律(LLN),在N趋近无穷时我们的期望会无限接近理论期望

计算期望

对于离散型随机变量

R 复制代码
probabilities
values <- c (1 , 2, 3, 4, 5)
probabilities <- c (0.1 , 0.2 , 0.3 , 0.2 , 0.2)

expected_value <- sum ( values * probabilities )

print ( expected_value )

对于连续型随机变量,需要使用蒙特卡洛方法

R 复制代码
# 假设连续型随机变量X遵循[0,1]内的均匀分布X~U(0,1)
set . seed (42) # 设置随机数种子方便复现结果
samples <- runif (10000) # 这个函数会从(0,1)内随机抽样10000次

# 计算抽样数据的平均值(蒙特卡洛)
expected_value_simulated <- mean ( samples )

# 打印
print ( expected_value_simulated )

方差 Variance

概念回顾

一般定义
::: align-center
Var(X)=E[(X-E[X])^2]

:::

对于离散型随机变量
::: align-center
Var(X)=\sum_{i}(x_i-E[X])^2P(X=x_i)

:::
对于连续型随机变量
::: align-center
Var(X)=\int_{-\infty}^{\infty}(x-E[X])^2f(x)dx

:::
此外还可以得到方差的公式为
::: align-center
Var(X)=E[X^2]-E[X]^2

:::

方差运算并不遵循线性性
::: align-center
Var(aX+bY)=a^2Var(X)+b^2Var(Y)+2abCov(X, Y)

:::
其中Cov(X,Y)为二者的协方差(Covariance),在二者相互独立时它为0

将方差开根即可得到标准差(Standard Deviation)
::: align-center
\sigma_x=\sqrt{Var(X)}

:::

R中的方差和标准差

R 复制代码
# 数据集
data <- c (5 , 7, 10 , 15 , 20)

# 使用var()函数计算方差
variance_value <- var ( data )

# 使用sd()函数计算标准差
std_dev <- sd ( data )

# 打印
print ( variance_value )
print ( std_dev )

R中的相关系数

首先回忆相关系数的公式
::: align-center
\rho_{XY}=\frac{Cov(X,Y)}{\sqrt{D(X)\sqrt{D(Y)}}}=\frac{\sum(x_i-\overline{x})(y_i-\overline{y})}{\sqrt{\sum(x_i-\overline{x})^2}\sqrt{\sum(y_i-\overline{y})^2}}

:::
在R中,处理相关系数的函数为cor(x, y)

R 复制代码
# 以mtcars数据集为例
data ( mtcars )

# 计算汽车的马力 ( hp ) 和每公里油耗的相关系数( mpg )
cor_hp_mpg <- cor ( mtcars$hp , mtcars$mpg )
游客

全部评论 (0)

暂无评论,快来抢沙发吧~