这是我不止一次遇到的问题,我脑海中有一个伪解,但它或多或少是一种蒙特卡洛方法,而不是任何聪明的方法。
我要做的就是将一个连续变量转换成一个分类变量,这样每个类别在响应变量中的均值就会有很大的不同。
因此,假设我正在尝试对不同年龄段的抑郁症的比率进行建模。在我的模型中,我希望最多有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)))

注意:我不关心解释,只关心预测能力。
发布于 2017-05-14 15:11:55
我不会从集群的角度来看待这个问题。相反,将其视为优化问题。然后做梯度下降来优化,或任何其他搜索。
另一种选择是分段线性回归,但实际上你想要的是“分段常量回归”。
https://stackoverflow.com/questions/43948501
复制相似问题