三分钟带你学会序列插值——优雅的imputeTS方法






三分钟带你学会序列插值——优雅的imputeTS方法

小果  生信果  2023-12-10 23:58:03

哈喽啊大家,今天小果将带大家学习的是imputeTS包,它是一种序列插值的自动化方法,可以有效地对时间序列以及可以视作时间序列的自相关序列进行缺失值可视化并进行缺失值填补。
imputeTS是用于时间序列数据的缺失值插补的R包。它提供了多种方法来处理时间序列数据中的缺失值,包括线性插补、插值、滚动窗口方法等等。我们可以使用这个包来处理时间序列数据中的缺失值,以便进行统计分析或机器学习任务。imputeTS包专注于单变量时间序列插补。它提供了多种最先进的插补算法实现,以及用于时间序列缺失数据统计的绘图函数。虽然插补问题一般都是一个众所周知的问题,并且已经广泛涵盖在R包中,但在能够填补单变量时间序列中的缺失值的包中寻找包是更加复杂的。这个问题的原因在于,大多数插补算法依赖于属性之间的互相关关系,而单变量时间序列插补需要使用时间依赖性。
几乎在每个领域,从工业到生物学,金融再到社会科学,都会测量不同的时间序列数据。尽管记录的数据集本身可能不同,但一个常见的问题是缺失值。许多分析方法要求在进行分析之前用合理的值替换缺失值。在统计学中,这个替换缺失值的过程被称为插补。时间序列插补是插补研究领域的一个特殊子领域。最流行的技术,如多重插补(Rubin,1987)、em算法(Dempster等人,1977)、最近邻(Vacek和Ashikaga,1980)和热卡(Ford,1983),依赖于属性间的互相关关系来估算缺失数据的值。由于单变量时间序列没有多于一个属性,这些算法不能直接应用。相反,有效的单变量时间序列插补算法需要使用时间间隔的相关性。自然地,imputeTS包可以应用在生物信息学中,特别是当我们处理时间序列数据或包含时间维度的生物信息学数据时。许多生物信息学数据具有时间依赖性,例如基因表达数据、蛋白质互作网络的动态变化等等。在这些情况下,数据中可能会存在缺失值,而imputeTS可以帮助我们插补这些缺失值,以便进行进一步的分析或建模。可以使用imputeTS包的方法来插补缺失值,并在生物信息学研究中进行数据清洗和预处理。这可以帮助更准确地分析生物信息学数据,发现潜在的模式和趋势,以及进行机器学习任务,如分类或聚类。   
公众号后台回复111获取代码,代码编号231201
插补算法简单示例

所有的插补算法都以相同的方式使用。输入必须是数字时间序列或数字向量。作为输出,将返回一个具有所有缺失值替换为插补值的输入数据版本。以下是一个小例子,展示如何使用插补算法。(所有插补函数都以na.’算法名称’开头)
首先,我们需要创建一个带有缺失数据的示例输入时间序列。
1.library(imputeTS)  2.# 创建一个带有缺失值的短时间序列示例  3.x <- ts(c(1, 2, 3, 4, 5, 6, 7, 8, NA, NA, 11, 12))
对于这个时间序列,我们可以应用不同的插补算法。我们首先使用na.mean,它用平均值替换缺失值。
1.# 使用na.mean插补缺失值  2.na.mean(x)  3.[1] 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 5.9 5.9 11.0 12.0
大多数函数还具有提供更多算法的附加选项(属于同一算法类别)。在下面的示例中,可以看到na.mean也可以使用option=”median”来调用,它用中位数替换缺失值。
1.# 使用na.mean插补缺失值,选项为median  2.na.mean(x, option="median")  3.[1] 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 5.5 5.5 11.0 12.0
虽然na.interpolation和所有其他插补函数的用法相同,但产生的结果可能不同。如下所示,对于这个数据,线性插值提供了更合理的结果。
1.# 使用na.interpolation插补缺失值  2.na.interpolation(x)  3.[1] 1 2 3 4 5 6 7 8 9 10 11 12
可视化函数

对于一般的更长且更复杂的时间序列(具有趋势和季节性),始终尝试使用na.kalman和na.seadec是个好主意,因为这些函数往往产生最佳结果。这些函数的使用方式与所有其他插补函数一样简单。
以下是应用于tsAirgap时间序列的na.kalman函数的用法示例。如下图所示,na.kalman为包含强烈季节性和强趋势的该系列提供了非常好的结果。  
ggplot_na_imputations
1.# 使用na.kalman插补缺失值  2.#(tsAirgap是imputeTS包提供的示例时间序列)  3.data("tsAirgap")  4.imp <- na.kalman(tsAirgap)  5.# 可视化代码  6.ggplot_na_imputations(tsAirgap, imp, tsAirgapComplete) 

ggplot_na_distribution(可视化缺失值分布):
 

这个函数用于可视化时间序列内缺失值的分布。时间序列会被绘制出来,每当值为NA时,背景颜色会不同。这样可以清晰地看到时间序列中大多数缺失值出现在哪些地方。下面是一个示例用法:
1.# 示例代码 'ggplot_na_distribution'  2.#(tsAirgap是imputeTS包提供的示例时间序列)  3.# 可视化此时间序列中的缺失值  4.ggplot_na_distribution(tsAirgap)
在图中,可以看到缺失数据的区域背景呈红色。整个图表相当易于理解。绘图函数本身无需进一步配置参数,但仍允许通过…传递绘图参数。

ggplot_na_distribution2(可视化缺失值分布的条形图):  

这个函数也用于可视化时间序列内缺失值的分布,但是以条形图的形式呈现,特别适用于时间序列太大而无法绘制的情况。多个时间间隔的观察值被分组在一起,并表示为条形。这些间隔的信息显示了缺失值的数量。以下是一个示例用法:
1.#(tsHeating是imputeTS包提供的示例时间序列)  2.# 可视化此时间序列中的缺失值  3. ggplot_na_distribution2(tsHeating,number_intervals = 20)  
在图中,可以看到x轴上的tsHeating系列非常大,有超过600,000个观察值。虽然可以使用ggplot_na_distribution那样可视化tsAirgap系列(144个观察值),但对于tsHeating系列来说,这肯定行不通。在绘图区域中,根本没有足够的空间来容纳600,000个单独的连续观察/数据点。ggplot_na_distribution2函数解决了这个问题,将多个观察值分组到间隔中。示例中的’number_intervals’参数定义了要使用的20个间隔。这意味着上图中的每个间隔代表大约30,000个观察值。前五个间隔完全是绿色的,这意味着数据中没有缺失值。这意味着从观察1到观察150,000之间的数据中没有缺失值。系列中间和末尾有几个间隔,每个间隔都有大约40%的缺失数据。这意味着在这些间隔中,30,000个观察中有12,000个NA。总之,该图能够为非常大的时间序列提供关于NA分布的良好但粗略的概述    

ggplot_na_gapsize(可视化不同NA间隙的频率):
 

这个绘图函数用于可视化时间序列中不同NA间隙(连续的NA值)的出现频率。该函数将此信息显示为排名。排名可以按照缺失值间隙大小占比(间隙大小的数量出现次数 * 间隙长度)或仅按照间隙大小的出现次数排序。最终的结果可以读取为:在时间序列x中,3个连续的NA出现最多,出现了20次,6个连续的NA出现次多,出现了5次,2个连续的NA出现第三多,出现了3次。以下是一个示例用法:
1.#(tsNH4是imputeTS包提供的示例时间序列)  2.# 可视化前NAs大小 / 连续的NA  3.ggplot_na_gapsize(tsNH4)
示例图解读如下:在时间序列tsNH4中,间隙大小157仅出现1次,但占据了所有间隙大小中NA最多的位置(157个NA)。间隙大小91(连续的91个NA)也仅出现1次,但占据了第二多的NA(91个NA)。间隙大小42在时间序列中出现2次,因此在总体上排名第三(84个NA)。间隙大小为1(前后没有其他NA)出现了68次,使其在总体NA中排名第四(68个NA)。    

分布的摘要统计信息
 

statsNA 函数在 imputeTS 包中提供了关于单变量时间序列中缺失值分布的摘要统计信息。以下是它提供的信息的解释:
·时间序列的长度: 这是时间序列中的观察次数,包括实际值和缺失值。
·缺失值的数量: 它表示时间序列中的总缺失值数量。
·缺失值的百分比: 这表示相对于时间序列中总观察次数的缺失值百分比。
·分段的缺失值统计: 它提供了不同分段或组的缺失值数量和百分比的信息,有助于分析缺失数据的模式。
·最长的 NA 间隙: 这是时间序列中最长连续的缺失值序列的长度(连续的 NA 值)。
·最常见的间隙大小: 它表示时间序列中最频繁出现的缺失值序列的长度。
·占据大多数 NA 的间隙大小: 这代表了在时间序列中总体上占据最多缺失值的连续缺失值序列。    
·NA 序列概览: 它提供了关于每个连续缺失值序列出现频率的概述。不出现的序列将在这个概述中被省略。
以下是如何使用 statsNA 函数的示例代码,请跟着小果一起练习哦:
1.# 示例代码 'statsNA'  2.#(tsNH4 是 imputeTS 包提供的示例时间序列)  3.# 打印关于缺失数据的统计信息  4.statsNA(tsNH4)
          
[1] “Length of time series:”
[1] 4552
[1] “————————-“
[1] “Number of Missing Values:”
[1] 883
[1] “————————-“
[1] “Percentage of Missing Values:”
[1] “19.4%”
[1] “————————-“
[1] “Number of Gaps:”
[1] 155
[1] “————————-“
[1] “Average Gap Size:”
[1] 5.696774
[1] “————————-“
[1] “Stats for Bins”
[1] ”  Bin 1 (1138 values from 1 to 1138) :      233 NAs (20.5%)”
[1] ”  Bin 2 (1138 values from 1139 to 2276) :      433 NAs (38%)”
[1] ”  Bin 3 (1138 values from 2277 to 3414) :      135 NAs (11.9%)”
[1] ”  Bin 4 (1138 values from 3415 to 4552) :      82 NAs (7.21%)”
[1] “————————-“
[1] “Longest NA gap (series of consecutive NAs)”
[1] “157 in a row”
[1] “————————-“
[1] “Most frequent gap size (series of consecutive NA series)”
[1] “1 NA in a row (occurring 68 times)”
[1] “————————-“
[1] “Gap size accounting for most NAs”
[1] “157 NA in a row (occurring 1 times, making up for overall 157 NAs)”    
[1] “————————-“
[1] “Overview NA series”
[1] ”  1 NA in a row: 68 times”
[1] ”  2 NA in a row: 26 times”
[1] ”  3 NA in a row: 16 times”
[1] ”  4 NA in a row: 10 times”
[1] ”  5 NA in a row: 8 times”
[1] ”  6 NA in a row: 4 times”
[1] ”  7 NA in a row: 2 times”
[1] ”  8 NA in a row: 3 times”
[1] ”  9 NA in a row: 2 times”
[1] ”  10 NA in a row: 1 times”
[1] ”  11 NA in a row: 1 times”
[1] ”  12 NA in a row: 2 times”
[1] ”  14 NA in a row: 1 times”
[1] ”  16 NA in a row: 1 times”
[1] ”  17 NA in a row: 1 times”
[1] ”  21 NA in a row: 1 times”
[1] ”  25 NA in a row: 1 times”
[1] ”  26 NA in a row: 1 times”
[1] ”  27 NA in a row: 1 times”
[1] ”  32 NA in a row: 1 times”
[1] ”  42 NA in a row: 2 times”
[1] ”  91 NA in a row: 1 times”
[1] ”  157 NA in a row: 1 times”
          
到这里,imputeTS包的应用就到这里结束啦,是不是很简单呢。希望小伙伴们课下对多学习哦。相信小伙伴们已经基本掌握了imputeTS R包,会通过R语言编写相应的程序。到这里线性规划问题就基本完结啦。小果要和大家说再见咯,一定要自己练习一下哦,同时如果大家想要继续了解更多有关R语言内容可以持续关注小果哦~


往期推荐

1.搭建生信分析流水线,如工厂一样24小时运转Snakemake——进阶命令
2.比blast还优秀的序列比对工具?HMMER来了
3.对单细胞分析毫无头绪?让popsicleR领你入门
4.小果带你绘制ROC曲线评估生存预测能力
5.软件包安装、打怪快又好,1024G存储的生信服务器;还有比这更省钱的嘛!!!