我创建了一个包含 3 个线性回归组件的数据框 dfall
x1=runif(50, min=0, max=100)
e1=runif(50, min=0, max=10)
y1 <- 0.2*x1+10+e1
y1
plot(x1,y1,col="blue")
df1 <- data.frame(x=x1,y=y1)
df1$ID <- 1
df1$col <- "red"
x2=runif(25, min=0, max=100)
e2=runif(25, min=0, max=5)
y2 <- 0.7*x2+15+e2
y2
plot(x2,y2,col="blue")
df2 <- data.frame(x=x2,y=y2)
df2$ID <- 2
df2$col <- "green"
x3=runif(35, min=0, max=100)
e3=runif(35, min=0, max=15)
y3 <- -0.5*x3+30+e3
y3
plot(x3,y3,col="blue")
df3 <- data.frame(x=x3,y=y3)
df3$ID <- 3
df3$col <- "blue"
dfall <-rbind(df1,df2,df3)
dfall
dfall <- dfall[sample(1:nrow(dfall)), ]
dfall
plot(dfall$x,dfall$y,col=dfall$col)
然后我尝试使用 kmeans 分离线性回归分量:
fitkm <- kmeans(dfall[,c(1:2)], 3)
dfall <- data.frame(dfall, km=fitkm$cluster)
dfall
但是我的分类结果很差:
table(dfall$ID,dfall$km)
是否有更好的方法来准确分离 3 个线性回归分量? 感谢您的帮助。
最佳答案
鉴于您的示例,您可能希望研究有限混合模型,这将使您能够恢复基础回归和分类中的参数。以下是您的数据示例:
library(mixtools)
mixmod <- regmixEM(dfall$y, dfall$x, k=3)
summary(mixmod)
输出为您提供了每种观测类型的比例和系数 - lambda 是混合比例,beta1 是截距,beta2 是系数。与您的模拟数据的匹配非常好:
summary of regmixEM object:
comp 1 comp 2 comp 3
lambda 0.315816 0.457191 0.226992
sigma 3.758362 2.463029 1.259267
beta1 36.675001 14.031268 17.338412
beta2 -0.507215 0.213874 0.699148
loglik at estimate: -357.4478
给定类别的观察值分配存储在 mixmod
对象中的概率矩阵中 mixmod$posterior
。如果我们提取分配的类并将其与真实类进行比较,则拟合非常好(请记住混合模型分配给类的名称是任意的,这里 comp 1 是 ID 3 obvs,等等):
predclass <- unlist(apply(mixmod$posterior, 1, function(x){names(which.max(x))}))
table(dfall$ID, predclass)
predclass
comp.1 comp.2 comp.3
1 2 48 0
2 0 0 25
3 31 4 0
混合模型及其在 R 中的实现有很好的概述和解释 here .
关于R 从混合物中分离出 3 个线性回归分量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41893831/