首先是库
library(tidyr)
library(leaps)
library(ggplots2)
library(ggdark)
模型的价值
set.seed(1)
X = rnorm(100)
e = rnorm(100)
Y = 8 + 7*X + 2.5*X^2 - 9*X^3 + e
拟合
data.all = data.frame(Y,X)
regfit.full = regsubsets(Y~poly(X,10,raw=T), data=data.all, nvmax=10)
(reg.summary = summary(regfit.full))
然后我得到每个变量的最小值
(reg.min.cp = which.min(reg.summary$cp))
(reg.min.bic = which.min(reg.summary$bic))
(reg.min.adjr2 = which.min(reg.summary$adjr2))
为绘图创建数据框
df = data.frame(reg.summary$cp, reg.summary$bic, reg.summary$adjr2)
df$rownum = 1:nrow(df)
重塑数据框
molten = df %>% gather(variable, value, reg.summary.cp:reg.summary.adjr2 )
使用刻面绘图
(lp = molten %>% ggplot(data=.) +
aes(x=rownum, y=value) +
geom_line(col="black") +
geom_point(data=molten, aes(xint=reg.min.adjr2, z="reg.summary.adjr2", col="red")) + # this is where I got the wrong plot
facet_wrap(~variable, scales="free_y")
)
它显示错误。我期望的是geom_point(data=molten, aes(xint=reg.min.adjr2, z="reg.summary.adjr2", col="red"))
仅将reg.min.adjr2
添加到构面reg.summary.adjr2
上,并且仅增加一个点。
如何以这种方式制作?
答案 0 :(得分:0)
我从这两个SO得到一些想法:
How to add different lines for facets
Add a segment only to one facet using ggplot2
我要做的是首先为cp
,bic
和adjr2
的最小值创建一个新的数据框。然后将点添加到主图中。
我确保x
的值是rownum,而y
是最小值。我还向variable
添加了一个参数min_plot
,以确保将其添加到右侧。
min_plot = data.frame(
rownum=c(reg.min.cp, reg.min.bic, reg.min.adjr2),
y = c(reg.summary$cp[reg.min.cp], reg.summary$bic[reg.min.bic], reg.summary$adjr2[reg.min.adjr2]),
variable=c("reg.summary.cp", "reg.summary.bic", "reg.summary.adjr2"))
(lp = molten %>% ggplot(data=.)
+ aes(x=rownum, y=value)
+ geom_line(col="black")
+ facet_wrap(~variable, scales="free_y")
+ geom_point(data = min_plot, aes(x=rownum, y=y), col="red")
)