如何聚类X以最大化Y中解释的方差?

时间:2017-05-13 01:58:59

标签: cluster-analysis

这是一个我不止一次遇到的问题,我心中有伪解决方案,但它或多或少是一种蒙特卡罗方法,而不是任何聪明的方法。

我尝试做的主要是将连续变量转换为分类变量,使每个类别在响应变量中具有显着不同的均值。

所以,让我们说我正试图对年龄组的抑郁率进行模拟。在我的模型中,我想要最多N个年龄组,并且每个组的界限可以任意大小(5-10,11-27,28-30,31-64 ......等)。问题是,如何选择N组的界限,可以最大化解释抑郁率​​的方差?

# Monte Carlo approach using iris dataset as an example
n_clust = 5

best_bounds = rep(0, n_clust)
best_groups = NULL
bestSSE = Inf

X_var = iris$Petal.Length
Y_var = iris$Sepal.Width

min_x = min(X_var)
max_x = max(X_var)
range_x = max_x - min_x

for (i in 1:10000){

  b = sort(runif(n_clust-1))
  b = cumsum(b / sum(b))
  bounds = min_x + b * range_x
  groups = cut(X_var, breaks = c(-Inf,bounds,Inf))

  model = lm(Y_var~groups)
  SSE = sum(model$residuals^2)
  if (SSE < bestSSE){
    print(SSE)
    best_bounds = bounds
    best_groups = groups
    bestSSE = SSE
  }
}

g = aggregate(Y_var, list(best_groups), mean)
names(g) = c("Cluster", "y_mean")
g$Cluster=c(best_bounds)

plot(X_var, Y_var, col='blue', pch=20)
abline(lm(Y_var~X_var), col='darkgray', lty=2)

for (i in 1:(nrow(g))){
  x0 = ifelse(i == 1, min_x-max_x, g[i-1,"Cluster"])
  x1 = ifelse(i < nrow(g), g[i,"Cluster"], 2*max_x)
  segments(x0,g[i,"y_mean"],x1,g[i,"y_mean"], col='red')
}

R_cont = summary(lm(Y_var~X_var))$r.squared
R_cat = summary(lm(Y_var~best_groups))$r.squared
title(paste("R^2:", round(R_cont,4),"vs",round(R_cat,4)))

Cluster X on Y

注意:我不关心解释,只关心预测能力。

1 个答案:

答案 0 :(得分:0)

我不会从聚类角度来看这个。相反,将其视为优化问题。然后做渐变下降以优化或任何其他搜索。

另一种选择是分段线性回归,但实际上你想要一个“分段常数回归”。