首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何对X进行聚类以最大化Y中的解释方差?

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

Stack Overflow用户
提问于 2017-05-13 09:58:59
回答 1查看 116关注 0票数 0

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

我要做的就是将一个连续变量转换成一个分类变量,这样每个类别在响应变量中的均值就会有很大的不同。

因此,假设我正在尝试对不同年龄段的抑郁症的比率进行建模。在我的模型中,我希望最多有N个年龄组,每个组的边界可以任意大小(5-10,11-27,28-30,31-64等)。问题是,如何选择界限,以便在有N个组的情况下,抑郁症发生率的解释方差可以最大化?

代码语言:javascript
复制
# 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)))

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

EN

回答 1

Stack Overflow用户

发布于 2017-05-14 15:11:55

我不会从集群的角度来看待这个问题。相反,将其视为优化问题。然后做梯度下降来优化,或任何其他搜索。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43948501

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档