이것은 여러 번 발생하는 문제이며, 의사 솔루션을 염두에두고 있지만 영리한 것이 라기보다는 몬테카를로 방법입니다.Y에서 설명 된 분산을 최대화하기 위해 X를 클러스터하는 방법?
내가하려는 것은 본질적으로 연속 변수를 범주 변수로 변환하는 것이고 각 범주는 응답 변수에서 상당히 다른 평균을 갖습니다.
그래서 나이 그룹에 대한 우울증 비율을 모델링하려고한다고 가정 해 봅시다. 내 모델에서는 최대 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)))
참고 : 나는 해석 만 예측 능력에 대해 걱정하지 않는다.
사실, 실제로는 최적화 문제입니다. 나는이 게시물을 만든 직후에 그렇게 보았습니다. 어떻게하면 R 및/또는 Python에서 이러한 접근 방식을 구현할 수 있을지에 대한 아이디어가 있습니까? 나는 문제를 정의하는 방법을 실제로 볼 수 없다. (주된 복잡성은 x 값을 어떻게 든 빈에 할당해야한다는 것이다.) 그리고 실제로,이 방법을 사용하여 자동 조각 별 회귀 분석을 만드는 것이 아이디어입니다. 그것만이 올바른 쓰레기통을 선택하기가 어렵습니다! – Corpsecreate
나는 내가 만족할만한 좋은 해결책을 발견했다고 생각한다! sol = optim (rep (0.5, n_clust), sse_loss, lower = rep (0, n_clust), upper = rep (1, n_clust), method = "L-BFGS-B") – Corpsecreate