gpt4 book ai didi

r - 沿单一方向延伸 geom_smooth

转载 作者:行者123 更新时间:2023-12-02 05:46:35 24 4
gpt4 key购买 nike

您可以非常轻松地在 ggplot2 中扩展回归线:

c <- ggplot(mtcars, aes(y=wt, x=mpg)) + xlim(0,50)
c + stat_smooth(method=lm, fullrange=TRUE) + geom_point()

我的问题是,是否可以只向一个方向延伸?

在你问之前,我保证我有充分的理由这样做!

最佳答案

stat_smooth的内部工作中,调用predictdf来创建平滑线。这里的困难是:这是一个未导出的 S3 方法。它也不接受...参数,因此扩展它确实很困难。

这里的想法是创建一个新的虚拟类 lm_rightlm_left,我们在其中调用默认的 lm 方法。

## decorate lm object with a new class lm_right
lm_right <- function(formula,data,...){
mod <- lm(formula,data)
class(mod) <- c('lm_right',class(mod))
mod
}

## decorate lm object with a new class lm_left
lm_left <- function(formula,data,...){
mod <- lm(formula,data)
class(mod) <- c('lm_left',class(mod))
mod
}

然后,我们为每个方法创建一个 predict_df 专门化,在其中截断相反一侧的 x 值。

predictdf.lm_right <- 
function(model, xseq, se, level){
## here the main code: truncate to x values at the right
init_range = range(model$model$x)
xseq <- xseq[xseq >=init_range[1]]
ggplot2:::predictdf.default(model, xseq[-length(xseq)], se, level)
}

左侧扩展也是如此:

predictdf.lm_left <- 
function(model, xseq, se, level){
init_range = range(model$model$x)
## here the main code: truncate to x values at the left
xseq <- xseq[xseq <=init_range[2]]
ggplot2:::predictdf.default(model, xseq[-length(xseq)], se, level)
}

最后一个使用示例:

library(ggplot2)
library(gridExtra)
## you should set the fullrange option to a true
p1 <- ggplot(mtcars, aes(y=wt, x=mpg)) + xlim(0,50) + geom_point() +
stat_smooth(method="lm_left", fullrange=TRUE,col='green')
p2 <- ggplot(mtcars, aes(y=wt, x=mpg)) + xlim(0,50) + geom_point() +
stat_smooth(method="lm_right", fullrange=TRUE,col='red')

grid.arrange(p1,p2)

enter image description here

关于r - 沿单一方向延伸 geom_smooth,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26705554/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com