按你的例子,帮你改写一下。
# 建立资料
set.seed(1)
dt <- data.frame(
x = runif(30),
y = c(rnorm(10,1,0.2), rnorm(10,2,0.2), rnorm(10,3,0.2))
)
# 建三个回归式
lm.1 <- lm(y ~ x, data = dt[ 1:10, ])
lm.2 <- lm(y ~ x, data = dt[11:20, ])
lm.3 <- lm(y ~ x, data = dt[21:30, ])
# 1. 我希望回归线的 x 在 [0.2, 0.8]
# 2. 如果回归线是直线,predict 二个点即可;
# 如果是曲线,就 predict 很多点让它看起来像曲线
dt.pd <- data.frame(x = c(0.2, 0.8))
y.pred.1 <- predict(lm.1, dt.pd)
y.pred.2 <- predict(lm.2, dt.pd)
y.pred.3 <- predict(lm.3, dt.pd)
# 画图
plot(NULL, xlim = c(0,1), ylim = c(0,4), xlab="x", ylab="y")
# 画点
points(dt$x[ 1:10], dt$y[ 1:10], pch = 2)
points(dt$x[11:20], dt$y[11:20], pch = 3)
points(dt$x[21:30], dt$y[21:30], pch = 4)
# 画回归线,可以用 segments() 或 lines()
# 以下我用 lines()
lines(c(0.2, 0.8), y.pred.1, lty = 2)
lines(c(0.2, 0.8), y.pred.2, lty = 3)
lines(c(0.2, 0.8), y.pred.3, lty = 4)
# 图示
legend(
x = 0, y = 4,
legend = c("Gropu 1", "Gropu 2", "Gropu 3"),
lty=c(2,3,4), pch=c(2,3,4)
)
※ 引述《sinclairJ (SunnyGymBoy)》之铭言:
: 如题 abline画出的线都是占整个版面 如下图
: ppt.cc/Nivoy
: 我要如何只画特定的区间? 如下图
: ppt.cc/9HpS6
: 目前的程式码如下
: #产生资料
: x=runif(50)
: y=runif(50)
: #得知区间
: library(ifultools)
: x <- seq(0,2*pi,length=50)
: y <- as.numeric(y)
: z <- linearSegmentation(x,y,n.fit = 10,angle.tolerance=15)
: plot(x,y,type="o", col="blue")
: abline(v=x[z], lty=2)
: #>z [1]14 36 表示1-13个资料点做一次回归 14~35 36~50以此类推
: #产生三个区间之资料
: data=t(rbind(x,y))
: data1=as.data.frame(data[c(1:13),])
: data2=as.data.frame(data[c(14:35),])
: data3=as.data.frame(data[c(36:50),])
: #分别对三个区间做回归
: model1=lm(y~x,data1) #intercept=0.5041,slope=-0.00728
: model2=lm(y~x,data2) #intercept=0.41374 ,slope=0.03807
: model3=lm(y~x,data3) #intercept=1.6148 ,slope=-0.2295
: #画abline
: abline(a=0.5041,b=-0.00728,col="red",lwd=2)
: abline(a=0.41374,b=0.003807,col="green",lwd=2)
: abline(a=1.6148,b=-0.2295,col="blue",lwd=2)
: 有请各位先进教导小弟一下~感谢!