我正在尝试使用TraMineR运行最佳匹配分析,但似乎我遇到了数据集大小的问题.我有一个包含就业法术的欧洲国家的大数据集.我有超过57,000个序列,长48个单位,由9个不同的状态组成.为了了解分析,这里是序列对象的头部employdat.sts
:
[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-...
Run Code Online (Sandbox Code Playgroud)
在较短的SPS格式中,其内容如下:
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)"
Run Code Online (Sandbox Code Playgroud)
将此序列对象传递给seqdist()
函数后,我收到以下错误消息:
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 …
Run Code Online (Sandbox Code Playgroud) 我使用以下R代码生成带有基于TraMineR序列的标签的树形图(参见附图):
library(TraMineR)
library(cluster)
clusterward <- agnes(twitter.om, diss = TRUE, method = "ward")
plot(clusterward, which.plots = 2, labels=colnames(twitter_sequences))
Run Code Online (Sandbox Code Playgroud)
完整代码(包括数据集)可以在这里找到.
由于树形图以图形方式提供信息,因此以文本和/或表格格式获取相同信息将非常方便.如果我调用对象clusterward的任何方面(由agnes创建),例如"order"或"merge",我会使用数字而不是我得到的名称来标记所有内容colnames(twitter_sequences)
.另外,我看不出如何输出树形图中以图形方式表示的分组.
总结一下:如何使用R以及理想情况下的电车/集群库正确显示标签,以文本/表格格式获取集群输出?
假设有三个序列要比较:a,b和c.传统上,得到的3乘3成对距离矩阵是对称的,表明从a到b的距离等于从b到a的距离.
我想知道TraMineR是否提供了一些方法来产生不对称的成对距离矩阵.
我正在尝试seqdef
使用SPELL格式创建一个序列对象.以下是我的数据示例:
spell <- structure(list(ID = c(1, 3, 3, 4, 5, 5, 6, 8, 9, 10, 11, 11,
12, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15,
15, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19,
19), status = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 2, 3, 1, 2, 3, 2, 3, 1, 1, …
Run Code Online (Sandbox Code Playgroud) 我正在使用R包TraMineR进行一些学术研究序列分析.
我想找到一个模式,定义为某人在目标公司,然后出去,然后回到目标公司.
(简化)我将州A定义为目标公司; B作为外部工业公司,C作为内部工业公司.
所以我想要做的是找到具有特定模式ABA或ACA的序列.
在查看这个问题(奇怪的子序列数?)并阅读用户指南后,特别是以下段落:
4.3.3子序列如果u的所有连续元素ui以相同的顺序出现在x中,则序列u是x的子序列,我们简单地用u x表示.根据这个定义,非共享>状态可以出现在序列u和x的共同序列之间.例如,u = S; M是x = S的>子序列; U; 米; MC.
和
7.3.2查找具有给定子序列的序列seqpm()函数计算包含给定子序列的序列数并收集其行索引号.该函数返回一个包含两个元素的列表.第一个元素MTab只是一个表,其中包含数据中给定子序列的出现次数.请注意,即使子序列在序列中出现多次,每个序列也只计算一次出现次数.列表的第二个元素MIndex给出包含子序列的序列的行索引号.这些索引号可用于访问相关序列(下面的示例).由于在字符串中搜索模式更容易,因此当使用带有TRUE选项的seqconc函数时,函数rst以此格式转换序列数据.
我得出结论,seqpm()是我完成工作所需的功能.
所以我的序列如下:AAAAABBBBBAAAAA
而且,根据我在mentiod源上找到的子序列的定义,我想我可以通过使用以下方式找到这种序列:
seqpm(sequence,"ABA")
Run Code Online (Sandbox Code Playgroud)
但这不会发生.为了找到我需要输入的示例序列
seqpm(sequence,"ABBBBBA")
Run Code Online (Sandbox Code Playgroud)
这对我需要的东西不是很有用.
非常感谢 !
我正在尝试使用R中的TraMineR使用时间日记数据(美国时间使用调查)进行序列分析.我将数据作为SPELL数据(id,开始时间,停止时间,事件)但是在尝试时我收到以下错误将其转换为STS或SPS数据:
as.matrix.data.frame中的错误(subset(data,,2)):dims [product 0]与object [9]的长度不匹配
我认为这与我如何将时间(作为角色)转换为日期/时间类型有关.我相信TraMineR需要一个POSIXlt格式?
这是我原始数据的片段(trcode是事件)
头(atus.act.short)
tucaseid tustarttim tustoptime trcode
1 2.00701e+13 04:00:00 08:00:00 10101
2 2.00701e+13 08:00:00 08:20:00 110101
3 2.00701e+13 08:20:00 08:50:00 10201
4 2.00701e+13 08:50:00 09:30:00 20102
5 2.00701e+13 09:30:00 09:40:00 180201
6 2.00701e+13 09:40:00 11:40:00 20102
Run Code Online (Sandbox Code Playgroud)
我使用strptime将字符串转换为POSIXlt:
atus.act.short$starttime.new <- strptime(atus.act.short$tustarttim, format="%X")
atus.act.short$stoptime.new <- strptime(atus.act.short$tustoptime, format="%X")
Run Code Online (Sandbox Code Playgroud)
我还将ID减少到只有两位数
atus.act.short$id <- atus.act.short$tucaseid-20070101070000
Run Code Online (Sandbox Code Playgroud)
我最终得到一个新的数据框如下:
id starttime.new stoptime.new trcode
1 44 2012-08-03 04:00:00 2012-08-03 08:00:00 10101
2 44 2012-08-03 08:00:00 2012-08-03 08:20:00 110101
3 44 2012-08-03 08:20:00 2012-08-03 08:50:00 …
Run Code Online (Sandbox Code Playgroud) 我试图使用"for"的"by",以便使用一个或两个组变量创建许多子图.两组变量都是一个因子变量(性别是虚拟的,父亲的社会地位有多个级别).如何在图例或图表标题中添加组的级别(也称为名称)?
这是我正在使用的代码.
library(TraMineR)
library(Hmisc)
data(biofam)
biofam.lab <- c("Parent", "Left", "Married", "Left+Marr",
"Child", "Left+Child", "Left+Marr+Child", "Divorced")
biofam.seq <- seqdef(biofam, 10:25, labels=biofam.lab)
class(biofam$sex)
levels(biofam$sex)
describe(biofam$sex)
class(biofam$cspfaj)
levels(biofam$cspfaj)
describe(biofam$cspfaj)
### Simple plots
seqdplot(biofam.seq)
seqdplot(biofam.seq, group=biofam$sex, title="Marital status by gender")
### Plot with automatic title using "by"
by(biofam.seq, biofam$sex, function(X) seqdplot(X, title="X$sex[1]"))
by(biofam.seq, biofam$sex, function(X) seqdplot(X, title=X$sex[1]))
### Plot with automatic title and multiple-grouping using "for"
for(n in c(1, 2, 3)) {
seqdplot(subset(biofam.seq, subset=biofam$cspfaj==(n)), title="(n)")
}
for(n in c(1, 2, 3)) {
seqdplot(subset(biofam.seq, subset=biofam$cspfaj==(n)), …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 TraMineR 一次分析多个序列。我已经看过 seqdef 但我很难理解当我处理多个变量时如何创建 TraMineR 数据集。我想我正在使用类似于 Aassve 等人使用的数据集的东西。(如教程中提到的),其中每个波都有关于几个状态的信息(例如孩子、婚姻、就业)。我所有的变量都是二进制的。以下是包含三个波浪 (D、W2、W3) 和三个变量的数据集示例。
D<-data.frame(ID=c(1:4),A1=c(1,1,1,0),B1=c(0,1,0,1),C1=c(0,0,0,1))
W2<-data.frame(A2=c(0,1,1,0),B2=c(1,1,0,1),C2=c(0,1,0,1))
W3<-data.frame(A3=c(0,1,1,0),B3=c(1,1,0,1),C3=c(0,1,0,1))
L<-data.frame(D,W2,W3)
Run Code Online (Sandbox Code Playgroud)
我可能是错的,但我发现的材料一次只涉及一个变量的数据管理和分析(例如,跨几波的就业状况)。我的数据集比上面的数据集大得多,因此我无法真正手动估算这些数据,如本教程第 48 页所示。有人使用 TraMineR (或类似的软件包)处理过这种类型的数据吗?
1) 您如何将上述数据提供给 TraMineR?
2)如何计算替代成本,然后对它们进行聚类?
非常感谢
我有一个包含超过250,000个观测值的大型数据集,我想使用该TraMineR
包进行分析.我特别想用命令seqtree
和seqdist
,当我的例子中使用10,000观察一个子样本,工作正常.我的计算机可以管理的限制是大约20,000个观察.
我想使用所有观察结果,我确实可以访问一台能够做到这一点的超级计算机.但是,这并没有太大帮助,因为该过程仅在单个核心上运行.因此,我的问题是,是否可以将并行计算技术应用于上述命令?或者还有其他方法可以加快这个过程吗?任何帮助,将不胜感激!
我正在使用最佳匹配算法在TraMineR中进行序列分析.不幸的是,由于右删失数据,我的序列长度不等.我的序列的最小长度是5,最大长度11.长度的变化对我感兴趣的序列之间的差异没有意义.因此,我想保持不等长度对序列之间总体差异的影响尽可能小.
我在Stovel和Bolan(2004(1))中读到了这个问题的可能解决方案,他们使用可变的indel成本取决于序列是否具有相同的长度.因此,对于相等长度的序列,它们使用固定的indel成本,并且对于不等长度,它们使用降低的成本,其"大约是固定成本的四分之一".
我的问题是: 一般来说,如何在TraMineR中编码缺失?作为空白元素还是应该在字母表中包含缺失状态?在Stovel和Bolan引入的TraMineR中是否存在应用可变indel成本的选项?如果是,怎么办呢?
(1)Stovel,Katherine和Marc Bolan."住宅轨迹:利用最优对齐方式揭示住宅流动结构".社会学方法与研究32(4):559-598.