TraMineR序列图x轴超出数据范围的原因排查与解决请求
解决TraMineR图表x轴超出数据截止年份的问题
我帮你梳理下这个问题的可能原因和解决方案,你遇到的x轴超出范围的问题大概率是序列定义时的小错误,以及图表参数未正确传递导致的。
问题回顾
你用TraMineR分析序列数据时,数据集截止到2018年,但**聚类相关的序列图(比如seqIplot分组图)和序列频率图(seqfplot)**的x轴总是超出这个时间范围;尝试手动限制到2017年也没用,仅这两类图有问题,整体序列图表现正常,你猜测可能和NA类别有关。
你的原始代码如下:
MyData <- read.csv2(file="e:/Dokumente (-videoedluxe)/IBP dokumente/Msc/seq/mappe1.csv", sep=";", skipNul=TRUE, stringsAsFactors=FALSE, na = "empty") str(MyData, sep=",") install.packages("TraMineR") Yes library("TraMineR") table(data$x1989) data.seq <-seqdef(MyData, var = 2:31, ext = TRUE, gaps="NA" alphabet=c("GOVspec","GOVinv","GOVno","IOspec","IOinv","IOno","ICspec","ICinv","ICno","MNCspec","MNCinv","MNCno","NGOspec","NGOspec","NGOinv","NGOno","NPOspec","NPOinv","NPOno","UNIspec","UNIinv","UNIno","EDUspec","EDUinv","EDUno", NA), states = c("GOVspec","GOVinv","GOVno","IOspec","IOinv","IOno","ICspec","ICinv","ICno","MNCspec","MNCinv","MNCno","NGOspec","NGOspec","NGOinv","NGOno","NPOspec","NPOinv","NPOno","UNIspec","UNIinv","UNIno","EDUspec","EDUinv","EDUno", NA) cpal(data.seq) <-c("aquamarine2","aquamarine3","aquamarine4","chocolate2","chocolate3","chocolate4","cadetblue2","cadetblue3","cadetblue4","gold1","gold3","gold4","green2","green3","green4","hotpink2","hotpink3","hotpink4","orange2","orange3","orange4","purple2","purple4","rosybrown","orchid2", "white") seqstatl(MyData) summary(data.seq) years = c(1989:2018) par(mfrow = c(1, 2)) seqdplot(data.seq, with.legend = FALSE, border = NA, x = years) seqlegend(data.seq) cost.constant <- seqsubm(data.seq, method="CONSTANT", time.varying= T, with.miss = FALSE) cost.trate <- seqsubm(data.seq, method="TRATE", time.varying= T, with.miss = FALSE) seqfplot(data.seq, withlegend="FALSE") seqmtplot(data.seq, withlegend="RIGHT", title="Mean Time", analysis.manual <- seqdist(data.seq, method="OM", sm="TRATE", indel=1.5) library(cluster) analysis.manual = agnes(analysis.manual) clusterward <- agnes(data.seq, method="ward") plot(clusterward, which.plots = 2) plot(analysis.trate, which.plots = 8) ## CLUSTER ANALYSIS cluster1 = cutree(analysis.trate, 1) cluster2 = cutree(analysis.trate, 2) cluster3 = cutree(analysis.trate, 3) cluster3 = cutree(analysis.trate, 4) # Distribution plot seqdplot(data.seq, group= cluster1, withlegend = F, border = NA, x = years) # Index plots seqIplot(data.seq, group= cluster1, withlegend = F, border = NA, x = years) seqIplot(data.seq, group= cluster2, withlegend = F, border = NA, x = years) seqIplot(data.seq, group= cluster3, withlegend = F, border = NA, x = years) seqIplot(data.seq, group= cluster4, withlegend = F, border = NA, x = years)
核心问题与解决方案
1. 修正seqdef中的错误定义(最关键)
你的序列定义代码有三处严重问题,这很可能是x轴异常的根源:
- 重复的类别:
alphabet和states里重复了NGOspec(出现两次),应该修正为"NGOspec","NGOinv","NGOno"的正确顺序 - 不必要的
NA类别:不需要把NA加入alphabet和states,TraMineR会通过gaps="NA"自动识别缺失值,额外加入NA会导致类别维度混乱 - 语法错误:
seqdef代码末尾缺少闭合括号,会导致序列对象解析异常
修正后的seqdef代码:
data.seq <- seqdef(MyData, var = 2:31, ext = TRUE, gaps="NA", alphabet=c("GOVspec","GOVinv","GOVno","IOspec","IOinv","IOno", "ICspec","ICinv","ICno","MNCspec","MNCinv","MNCno", "NGOspec","NGOinv","NGOno","NPOspec","NPOinv","NPOno", "UNIspec","UNIinv","UNIno","EDUspec","EDUinv","EDUno"), states = c("GOVspec","GOVinv","GOVno","IOspec","IOinv","IOno", "ICspec","ICinv","ICno","MNCspec","MNCinv","MNCno", "NGOspec","NGOinv","NGOno","NPOspec","NPOinv","NPOno", "UNIspec","UNIinv","UNIno","EDUspec","EDUinv","EDUno"))
2. 给所有时间轴相关图表传递x参数
你给seqdplot加了x=years,但seqfplot和部分seqIplot没加!seqfplot默认不会自动读取你定义的时间向量,必须手动指定:
# 修正序列频率图的x轴 seqfplot(data.seq, withlegend="FALSE", x = years)
确保所有聚类后的seqIplot和seqdplot都带上x=years参数,保持时间轴一致。
3. 修正聚类分析中的变量定义错误
你的代码里analysis.trate没有被定义就直接用了,导致后续聚类图异常,修正如下:
# 先计算距离矩阵 analysis.manual <- seqdist(data.seq, method="OM", sm="TRATE", indel=1.5) # 再生成聚类对象 analysis.trate <- agnes(analysis.manual)
4. 验证时间维度匹配
检查序列对象的时间点数量和years向量长度是否一致:
cat("序列时间点数量:", ncol(data.seq), "\n") cat("years向量长度:", length(years), "\n")
如果两者不一致,说明var=2:31选择的列数不对,需要调整列范围以匹配1989-2018的30个时间点。
修正后的关键代码示例
把这些修正点整合后,核心代码片段如下:
# 读取数据(保持你的原始读取逻辑) MyData <- read.csv2(file="e:/Dokumente (-videoedluxe)/IBP dokumente/Msc/seq/mappe1.csv", sep=";", skipNul=TRUE, stringsAsFactors=FALSE, na = "empty") # 加载包 library(TraMineR) library(cluster) # 修正序列定义 data.seq <- seqdef(MyData, var = 2:31, ext = TRUE, gaps="NA", alphabet=c("GOVspec","GOVinv","GOVno","IOspec","IOinv","IOno", "ICspec","ICinv","ICno","MNCspec","MNCinv","MNCno", "NGOspec","NGOinv","NGOno","NPOspec","NPOinv","NPOno", "UNIspec","UNIinv","UNIno","EDUspec","EDUinv","EDUno"), states = c("GOVspec","GOVinv","GOVno","IOspec","IOinv","IOno", "ICspec","ICinv","ICno","MNCspec","MNCinv","MNCno", "NGOspec","NGOinv","NGOno","NPOspec","NPOinv","NPOno", "UNIspec","UNIinv","UNIno","EDUspec","EDUinv","EDUno")) # 设置颜色(保持你的原始配色) cpal(data.seq) <-c("aquamarine2","aquamarine3","aquamarine4","chocolate2","chocolate3","chocolate4","cadetblue2","cadetblue3","cadetblue4","gold1","gold3","gold4","green2","green3","green4","hotpink2","hotpink3","hotpink4","orange2","orange3","orange4","purple2","purple4","rosybrown","orchid2", "white") # 定义时间向量 years = c(1989:2018) # 绘制正常序列图(已正确设置x轴) par(mfrow = c(1, 2)) seqdplot(data.seq, with.legend = FALSE, border = NA, x = years) seqlegend(data.seq) # 绘制序列频率图(新增x参数) seqfplot(data.seq, withlegend="FALSE", x = years) # 聚类分析修正 analysis.manual <- seqdist(data.seq, method="OM", sm="TRATE", indel=1.5) analysis.trate <- agnes(analysis.manual) # 聚类分组 cluster1 = cutree(analysis.trate, 1) cluster2 = cutree(analysis.trate, 2) cluster3 = cutree(analysis.trate, 3) cluster4 = cutree(analysis.trate, 4) # 修正你重复赋值cluster3的问题 # 绘制聚类后的序列图(确保都带x参数) seqIplot(data.seq, group= cluster1, withlegend = F, border = NA, x = years) seqIplot(data.seq, group= cluster2, withlegend = F, border = NA, x = years) seqIplot(data.seq, group= cluster3, withlegend = F, border = NA, x = years) seqIplot(data.seq, group= cluster4, withlegend = F, border = NA, x = years)
按照这些修正操作后,你的图表x轴应该会正确截止到2018年,不会再超出范围了。
内容的提问来源于stack exchange,提问作者Traminer_Crisis
相关产品推荐
相关产品推荐

