使用 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)
我正在尝试对纵向调查数据进行事件序列分析。我想创建一个看起来像这样的图(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)