对数据子集进行geom_smooth

时间:2013-06-19 15:31:16

标签: r ggplot2 regression subset

以下是一些数据和情节:

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)

enter image description here

正如您所看到的,线性回归受x = 1的值的影响很大。 我是否可以获得针对x> = 2计算的线性回归,但显示x = 1(y等于0或1)的值。 除线性回归外,结果图将完全相同。他们不会“受到”这些值对abscisse = 1

的影响

2 个答案:

答案 0 :(得分:12)

就像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)

enter image description here

答案 1 :(得分:8)

常规lm函数有一个weights参数,您可以使用该参数为特定观察指定权重。通过这种方式,您可以了解观察对结果的影响。我认为这是处理问题而不是数据子集的一般方法。当然,分配权重ad hoc对于分析的统计稳健性来说并不是好兆头。最好有权重背后的基本原理,例如:低重量观测具有较高的不确定性。

我认为引擎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