首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >大数据的问题(?)在使用TraMineR计算序列距离期间

大数据的问题(?)在使用TraMineR计算序列距离期间
EN

Stack Overflow用户
提问于 2013-04-10 17:54:29
回答 2查看 1.6K关注 0票数 7

我正在尝试使用TraMineR运行最佳匹配分析,但似乎遇到了数据集大小的问题。我有一个欧洲国家的大型数据集,其中包含就业情况。我有超过57,000个序列,它们有48个单位长,由9个不同的状态组成。为了获得分析的概念,这里是sequence object employdat.sts的头部:

代码语言:javascript
复制
[1] EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-...  
[2] EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-...  
[3] ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-...  
[4] ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-...  
[5] EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-...  
[6] ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-...  

在较短的SPS格式中,如下所示:

代码语言:javascript
复制
Sequence               
[1] "(EF,48)"              
[2] "(EF,48)"              
[3] "(ST,48)"              
[4] "(ST,36)-(MS,3)-(EF,9)"
[5] "(EF,48)"              
[6] "(ST,24)-(EF,24)"

将此序列对象传递给seqdist()函数后,我得到以下错误消息:

代码语言:javascript
复制
employdat.om <- seqdist(employdat.sts, method="OM", sm="CONSTANT", indel=4)    
[>] creating 9x9 substitution-cost matrix using 2 as constant value  
[>] 57160 sequences with 9 distinct events/states  
[>] 12626 distinct sequences  
[>] min/max sequence length: 48/48  
[>] computing distances using OM metric  
Error in .Call(TMR_cstringdistance, as.integer(dseq), as.integer(dim(dseq)),  : negative length vectors are not allowed

这个错误是否与大量不同的长序列有关?我使用的是一台x64内存的机器,内存为4 GB,我也曾在一台内存为8-GB的机器上尝试过,它会重现错误消息。有人知道解决这个错误的方法吗?此外,使用相同的语法对每个国家进行分析,并为该国家编制索引,效果良好,并产生了有意义的结果。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-10 18:54:18

我以前从未见过这个错误代码,但它很可能是由于您的大量序列造成的。你至少可以尝试做两件事:

  • 在seqdist中使用参数"full.matrix=FALSE" (参见帮助页)。
  • 您可以聚合相同的序列(您只有12626个不同的序列,而不是57160个序列),计算距离,使用权重(根据每个不同序列在数据集中出现的次数计算)对序列进行聚类,然后将聚类添加回原始数据集。使用WeightedCluster库可以很容易地做到这一点。WeightedCluster手册》的第一个附录提供了执行此操作的分步指南(网页http://mephisto.unige.ch/weightedcluster).

上也介绍了该过程

希望这能有所帮助。

票数 8
EN

Stack Overflow用户

发布于 2013-04-10 23:16:42

一个简单的解决方案通常效果很好,那就是只分析你的数据样本。例如

代码语言:javascript
复制
employdat.sts <- employdat.sts[sample(nrow(employdat.sts),5000),]

会抽取5000个序列的随机样本。探索如此重要的样本应该在很大程度上足以找出序列的特征,包括它们的多样性。

为了提高代表性,您甚至可以采用一些分层采样(例如,通过第一个或最后一个状态,或者通过数据集中的一些可用协变量)。由于您手头有原始数据集,因此您可以完全控制随机抽样设计。

更新

如果聚类是目标,并且您需要每个单独序列的聚类成员资格,请参见https://stackoverflow.com/a/63037549/1586731

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15929936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档