对数据子集使用geom_smooth

16

这里有一些数据和一个图:

set.seed(18)
data = data.frame(y=c(rep(0:1,3),rnorm(18,mean=0.5,sd=0.1)),colour=rep(1:2,12),x=rep(1:4,each=6))

ggplot(data,aes(x=x,y=y,colour=factor(colour)))+geom_point()+ geom_smooth(method='lm',formula=y~x,se=F)

从图中可以看出,线性回归受x=1处数值的影响很大。 我能否计算x >= 2的线性回归,但显示x=1时的值(y等于0或1)。 得到的图形除了线性回归外完全相同。它们不会“遭受”自变量=1处数值的影响。

3个回答

18

这就像是 geom_smooth(data=subset(data, x >= 2), ...) 一样简单。如果这个图只是给你自己看的话倒也不重要,但是要意识到,如果你没有提到回归是如何进行的,那么像这样的图会误导其他人。我建议改变被排除点的透明度。

ggplot(data,aes(x=x,y=y,colour=factor(colour)))+
geom_point(data=subset(data, x >= 2)) + geom_point(data=subset(data, x < 2), alpha=.2) +
geom_smooth(data=subset(data, x >= 2), method='lm',formula=y~x,se=F)

这里输入图片描述


2
啊,我喜欢简单的解决方案!非常感谢。还有,感谢您的建议和透明度技巧。 - Remi.b
如果我的数据集出现“美学必须是长度为1或与数据相同”的错误,我该怎么办? - half-pass

9
常规的lm函数有一个weights参数,您可以使用它来为特定观测分配权重。通过这种方式,您可以平衡观测对结果的影响,而不是仅仅将数据进行子集划分。当然,即兴分配权重对于分析的统计学健全性并不利。最好总是有一个权重背后的理由,例如低权重观测具有更高的不确定性。
我认为在幕后,ggplot2使用lm函数,因此您应该能够传递weights参数。您可以通过美学(aes)添加权重,假设权重存储在向量中:
ggplot(data,aes(x=x,y=y,colour=factor(colour))) + 
    geom_point()+ stat_smooth(aes(weight = runif(nrow(data))), method='lm')

你还可以在数据集中的一列中加入权重:

ggplot(data,aes(x=x,y=y,colour=factor(colour))) + 
    geom_point()+ stat_smooth(aes(weight = weight), method='lm')

当列名为weight时。


1

我尝试了@Matthew Plourde的解决方案,但subset对我没有用。与原始数据相比,使用子集没有改变任何内容。我将subset替换为filter,它就有效了:

ggplot(data,aes(x=x,y=y,colour=factor(colour)))+
geom_point(data=data[data$x >= 2,]) + geom_point(data=data[data$x < 2,], alpha=.2) +
geom_smooth(data=data[data$x >= 2,], method='lm',formula=y~x,se=F)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接