【问题标题】:Remove missing data state ‘%’ when using TraMineR’s seqpcplot() function使用 TraMineR 的 seqpcplot() 函数时删除丢失的数据状态“%”
【发布时间】:2020-08-06 19:50:59
【问题描述】:

我正在尝试对纵向调查数据进行事件序列分析。我想创建一个看起来像这样的图(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 个潜在状态中的 1 个。序列的总长度因参与者而异,具体取决于他们被采访的次数(例如,参与者 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:如果不是,为什么不呢?在我看来,完全可以在这样的图表上绘制不同长度的事件序列,而无需求助于这个“%”类别。

提前感谢您的宝贵时间!

【问题讨论】:

    标签: r traminer longitudinal sequence-analysis


    【解决方案1】:

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

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

    这仅适用于tevent = 'state' 并将空符号留在结果事件序列的字母表中。

    更好的解决方案是作用于状态到事件的转换矩阵tevent:首先,生成与所选方法关联的矩阵,然后清空与 void 状态关联的列的条目。下面我用'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)
    

    【讨论】:

    • 嗨@Gilbert,非常感谢您的反馈!我已经在上面的示例中进行了尝试,它完全按照您所说的进行。即,删除“%”序列对象。如果可以的话,我有两个后续问题:(1) 当我绘制这个新的事件序列数据时,seqpcplot() 仍然显示 '%' 类别,即使没有序列包含它。你知道如何从情节中删除它吗? (2) 当我将此应用于我的实际数据时,我收到错误消息Error in seqpcplot_private(seqdata = seqdata, group = group, weights = weights, : [!] cannot link weight and id vector你知道是什么原因造成的吗?
    • tevent='state'得到的事件序列的pc-plot与状态序列的DSS相同。所以试试seqpcplot(seqdss(data.seq))。至于错误,我需要数据和代码。
    • 嗨@Gilbert,这个变化已经解决了,谢谢!它还用我的实际数据停止了错误。感谢大家的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2019-11-16
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多