在R语言中生成含随机数据的聚类离群点(单因变量多自变量场景)
生成单因变量+多自变量的聚类离群点数据集
我明白你想要的是那种「大部分样本聚成主簇,小部分离群点单独形成一个独立簇」的数据集,而且是针对**单因变量(y)搭配多个自变量(x矩阵)**的场景对吧?之前的代码没达到预期,主要是在多自变量的聚类离群点处理上有点小问题,我来帮你调整下:
之前代码的问题分析
- 第一个代码里,你把
x定义成了矩阵,但用x>b做判断时,是把矩阵里的每个元素单独和分位数比较,这样标记的是单个自变量维度上的极端值,不是真正的「聚类离群点」(聚类离群点需要在多个自变量维度上同时偏离主簇)。 - 第二个代码里,
x=rbind(xa,xb)得到的是2行50列的矩阵,但y是100个元素,维度不匹配,plot的时候自然出不来正确的结果。
修正后的代码实现
下面的代码会生成主簇样本+聚类离群点,并且保证多自变量和单因变量的维度匹配,同时可视化效果清晰:
# 设置基础参数 n_main <- 50 # 主簇的样本数量 p <- 2 # 自变量的个数(可以改成你需要的数量) n_outlier <- 5 # 离群点的样本数量 # 固定随机种子,让结果可复现 set.seed(123) # 生成主簇数据:多自变量+对应因变量(给y加一点和x的相关性,更贴近真实场景) x_main <- matrix(rnorm(n_main * p), ncol = p, dimnames = list(NULL, paste0("x", 1:p))) y_main <- 0.5*x_main[,1] + 0.3*x_main[,2] + rnorm(n_main, sd = 0.2) # 生成聚类离群点:所有自变量维度都偏离主簇,因变量也同步偏离 x_outlier <- matrix(rnorm(n_outlier * p, mean = 4, sd = 0.5), ncol = p, dimnames = list(NULL, paste0("x", 1:p))) y_outlier <- 0.5*x_outlier[,1] + 0.3*x_outlier[,2] + rnorm(n_outlier, mean = 5, sd = 0.2) # 合并主簇和离群点数据 x <- rbind(x_main, x_outlier) y <- c(y_main, y_outlier) # 标记样本组别,方便画图区分 group <- c(rep("主簇", n_main), rep("离群点", n_outlier)) # 可视化方式1:散点图矩阵,同时展示所有变量间的关系 pairs(cbind(x, y), col = ifelse(group == "主簇", "deepskyblue", "firebrick"), pch = 16, main = "多自变量+单因变量的聚类离群点分布") # 可视化方式2:分图展示每个自变量和因变量的关系 par(mfrow = c(1, p)) for(i in 1:p){ plot(x[,i], y, col = ifelse(group == "主簇", "deepskyblue", "firebrick"), pch = 16, xlab = paste0("自变量x", i), ylab = "因变量y", main = paste0("y vs x", i)) }
代码说明
- 主簇的
y和x设置了弱线性相关,避免数据完全随机,更符合实际研究场景; - 离群点的所有自变量都设置了偏移(主簇均值为0,离群点均值为4),同时
y也整体偏移,这样就形成了真正的聚类离群点(不是单个维度的极端值); - 用
group标记样本组别,画图时用不同颜色区分,能直观看到离群点和主簇的差异; - 两种可视化方式:散点图矩阵适合观察多变量间的整体关系,分图适合聚焦单个自变量和因变量的关系。
如果想要离群点和主簇的相关性完全不同(比如主簇正相关,离群点负相关),只需要调整y_outlier的生成逻辑即可,比如把0.5*x_outlier[,1] + 0.3*x_outlier[,2]改成-0.5*x_outlier[,1] -0.3*x_outlier[,2]。
内容的提问来源于stack exchange,提问作者jeza
相关产品推荐
相关产品推荐

