使用 TraMineR 的 seqpcplot() 函数时删除丢失的数据状态“%”

Remove missing data state ‘%’ when using TraMineR’s seqpcplot() function

我正在尝试对纵向调查数据进行事件序列分析。我想创建一个看起来像这样的图(https://www.researchgate.net/publication/279560802_Exploratory_mining_of_life_event_histories 的第 44 页),我相信它是使用 TraMineR 中的 seqpcplot() 函数生成的:

这将使我能够确定参与者在调查中过渡的常见职业状态(例如“全职教育 >> 全职工作”或“全职工作 >> 兼职工作 >>家庭责任”)。

不幸的是,不同的参与者在调查中停留的时间不同,导致序列长度不同。这似乎导致 TraMineR 在除最长序列之外的所有序列的末尾创建缺失数据状态“%”(我想确保它们的长度都相同?)。然后将此附加状态“%”插入到 seqpcplot() 图中。

这是一个随机生成的问题示例:

## Import libraries and set seed
library(TraMineR)
set.seed(123)



## Define functions

# Function which randomly generates sequences of varying length
ranseq <- function(x,y) {
  y[round(runif( round(runif(1, 1, x)), 1, length(y)) ) ]
}

# Function which creates dataframe from randomly generated sequences
rangen <- function(x,y,z) {
  # Create list of randomly generated sequences
  data <- list()
  for (i in 1:x) {
    a <- ranseq(y,z)
    b <- c(a, rep(NA, y-length(a) ) )
    data[[i]] <- b
  }
  # Convert to dataframe
  data <- data.frame(do.call(rbind, data))
  return(data)
}



## Generate sequences

# Define possible sates of the sequence
states <- c("A","B","C","D","E","F")

# Run rangen function (no. rows, max seq length, possible states)
data <- rangen(300,25,states)



## Convert to sequence object

# Convert data to a state sequence object
# NOTE THAT ALL MISSING VALUES (NAs) BEFORE, WITHIN AND AFTER SEQUENCES ARE DELETED
data.seq <- seqdef(data = data, alphabet = states, states = states, labels = states, 
                   left = "DEL", right = "DEL", gaps = "DEL")
head(data.seq)

####################################################################################

  Sequence                         
1 E-C-E-F-A-D-E-D                  
2 F-C-D-D-B-E-B-A-C-F-E-D          
3 F-D-E-D-D-B-B-F-F-D-E-A-C-E-B-C  
4 B-C-C-C-B-B-B                    
5 B-E-A-C-E-B-D-B-B-E-E-C          
6 A-C-B-E-C-E-E-E-C-E-D-E-A-C-B-C-D

在此示例中,参与者在每波调查中被分配了 6 种潜在状态中的一种。序列的总长度因参与者而异,具体取决于他们接受采访的次数(例如,参与者 4 接受了 7 次采访,而参与者 6 接受了 17 次采访)。

但是,一旦将其转换为事件序列对象,几乎每个序列的末尾都会添加一个最终状态“%”:

# Convert to event sequence object
data.eseq <- seqecreate(data.seq, tevent = "state")
head(data.eseq)

####################################################################################

 [1] (E)-1-(C)-1-(E)-1-(F)-1-(A)-1-(D)-1-(E)-1-(D)-1-(%)-0                                          
[2] (F)-1-(C)-1-(D)-2-(B)-1-(E)-1-(B)-1-(A)-1-(C)-1-(F)-1-(E)-1-(D)-1-(%)-0                        
[3] (F)-1-(D)-1-(E)-1-(D)-2-(B)-2-(F)-2-(D)-1-(E)-1-(A)-1-(C)-1-(E)-1-(B)-1-(C)-1-(%)-0            
[4] (B)-1-(C)-3-(B)-3-(%)-0                                                                        
[5] (B)-1-(E)-1-(A)-1-(C)-1-(E)-1-(B)-1-(D)-1-(B)-2-(E)-2-(C)-1-(%)-0                              
[6] (A)-1-(C)-1-(B)-1-(E)-1-(C)-1-(E)-3-(C)-1-(E)-1-(D)-1-(E)-1-(A)-1-(C)-1-(B)-1-(C)-1-(D)-1-(%)-0

这导致以下“seqpcplot”:

## Plot seqpcplot
# NOTE THAT 'missing' HAS BEEN SET TO "hide" AND 'with.missing' TO 'FALSE'
seqpcplot(seqdata = data.eseq, filter = list(type = "function", value = "linear"),
          order.align = "first", missing = "hide", with.missing = FALSE)

在这里,几乎每个序列都以状态“%”结束。这没有用,因为它只告诉我这些事件序列在序列末尾附加了“缺失数据”,以说明它们比数据集中最长的序列更短。

问题 1:是否有任何方法可以格式化数据或图形以删除此缺失数据状态“%”?

问题2:如果不是,为什么不呢?在我看来,完全有可能在这样的图表上绘制不同长度的事件序列,而无需求助于这个“%”类别。

提前感谢您的宝贵时间!

seqecreate中您可以指定结束观察时间的事件。所以一个简单的解决方案是将状态序列对象(默认为'%')的void属性指定为end.event

data.eseq <- seqecreate(data.seq, tevent = "state", 
                        end.event = attr(data.seq,'void') )

这仅在 tevent = 'state' 时有效,并在结果事件序列的字母表中保留空符号。

更好的解决方案是作用于state-to-event转换矩阵tevent:首先,生成与所选方法关联的矩阵,然后清空与无效状态关联的列的条目。我在下面使用 'transition' tevent 方法进行说明。

sq.dat <- c('AAAA','AAAC','ABC','ABAA','AC')
sqm <- seqdef(seqdecomp(sq.dat, sep=''), right='DEL')
tm <- seqetm(sqm,method='transition')
tm[,which(colnames(tm)==attr(sqm,'void'))] <- ''
sqe <- seqecreate(sqm,tevent=tm)
alphabet(sqe)
##[1] "A"   "A>B" "A>C" "B>A" "B>C"
seqpcplot(sqe)