R语言中比特币推特情感分数时间序列分析的异常问题排查
问题排查与解决步骤
1. 先确认数据实际量是否正常
你说运行First_diff$Sentiment_score只看到小样本,大概率是R的默认显示设置问题——当向量/列的元素数量极大时,R只会展示前6条(head()本来就是取前6条),不是真的只有6条数据。
运行以下命令确认实际数据量:
# 查看数据框总行数 nrow(First_diff) # 查看情感分列的长度 length(First_diff$Sentiment_score)
如果结果是2623105,说明数据没问题,只是显示限制;如果不是,那你在一阶差分或数据过滤的步骤里出错了,比如:
- 差分前没按时间戳排序,导致差分逻辑错误
- 差分后误删了大量数据(比如错误的
filter条件) - 数据框的
Sentiment_score列被意外替换成了小样本
2. 解决时间序列绘图全黑块的问题
你用ts()的方式完全错误——ts()是给均匀时间间隔的序列用的(比如每天/每小时固定一条数据),但你的推特数据是非均匀时间戳(262万条数据挤在600多天里,每条时间都不固定),直接转ts会把所有数据当成连续的整数时间点,x轴被压缩到极致,所有点重叠成黑块。
正确的两种处理方式:
方式一:按固定频率聚合数据(推荐)
把高频的推特数据按天/小时/分钟聚合,计算平均情感分,变成均匀间隔的序列后再绘图:
# 先确保日期列是POSIXct类型 First_diff$date <- as.POSIXct(First_diff$date, format = "%Y-%m-%d %H:%M:%S") # 按天聚合,计算每日平均情感分(用dplyr) library(dplyr) daily_data <- First_diff %>% mutate(day = as.Date(date)) %>% group_by(day) %>% summarise(avg_sentiment = mean(Sentiment_score, na.rm = TRUE)) # 绘图 plot(daily_data$day, daily_data$avg_sentiment, type = "l", xlab = "日期", ylab = "平均情感分") # 或者用ggplot更美观 library(ggplot2) ggplot(daily_data, aes(x = day, y = avg_sentiment)) + geom_line(color = "steelblue") + labs(x = "日期", y = "每日平均情感分") + theme_minimal()
方式二:直接绘制原始高频数据
如果非要保留所有原始数据,不要用ts(),直接用基础绘图或ggplot,用极小的点避免重叠:
# 基础绘图用小点 plot(First_diff$date, First_diff$Sentiment_score, type = "p", pch = ".", xlab = "时间", ylab = "差分后情感分") # ggplot用极小尺寸的点 ggplot(First_diff, aes(x = date, y = Sentiment_score)) + geom_point(size = 0.05, alpha = 0.3) + labs(x = "时间", y = "差分后情感分") + theme_minimal()
3. 额外检查一阶差分的正确性
你提到原始438万条,差分后剩262万,这个行数差有点大——正常一阶差分(相邻行做差)应该是原行数减1(4383185条)。如果行数少了很多,说明你可能在差分后做了额外过滤(比如删除了包含NA的行,但正常只有第一行会是NA),或者是按分组差分(比如按用户/话题分组后差分),这时候要检查你的差分代码是否符合预期。比如正确的时序差分应该先按时间排序:
# 正确的时序一阶差分步骤 First_diff <- original_data %>% arrange(date) %>% # 必须先按时间戳排序! mutate(Sentiment_score = Sentiment_score - lag(Sentiment_score)) %>% drop_na(Sentiment_score) # 删除第一行的NA
内容的提问来源于stack exchange,提问作者A. Jahanyar
相关产品推荐
相关产品推荐

