首页 > 解决方案 > 提取 stat_xspline 拟合的方法

问题描述

我正在为少量点创建一个带有 geom_xspline 平滑器的图,我想获得 X 范围内所有整数值的平滑 y 值。知道如何获得它们吗?

library(ggplot2)
library(ggalt)
avgTheta<-c(-0.36,0.497085315,0.599960557,0.574336142,0.400831445,0.105615915,-0.250223072)
ageGroup<-c(11,16,23,33,43,53,63)
df <- data.frame(ageGroup, avgTheta)
p <- ggplot(df, aes(x = ageGroup, y = avgTheta))
p + 
 geom_xspline(spline_shape=-0.3, size=2, color='lightblue') +
 geom_point(size=3)

标签: rggplot2

解决方案


包中的xspline()函数graphics将返回积分。您应该可以使用该draw=FALSE参数,但我仍然需要先调用plot.new()它才能起作用。首先,制作数据。

library(ggplot2)
library(ggalt)
avgTheta<-c(-0.36,0.497085315,0.599960557,0.574336142,0.400831445,0.105615915,-0.250223072)
ageGroup<-c(11,16,23,33,43,53,63)
df <- data.frame(ageGroup, avgTheta)

其次,使用xspline()函数并将结果转换为数据框。

plot.new()
xs <- xspline(x=df$ageGroup, y=df$avgTheta, shape=-0.3, draw=FALSE)
xs <- do.call(data.frame, xs)

中的值xs是构成曲线的值。它们不仅仅是整数值,x而且似乎没有办法让它们只是整数值。制作 ggplot 以显示这两个结果做同样的事情。

p2 <- ggplot() + 
  geom_line(data=xs, aes(x=x, y=y), size=2, color='lightblue') +
  geom_point(data=df, aes(x = ageGroup, y = avgTheta), size=3)
p2

在此处输入图像描述


编辑

为了解决关于获取整数值的问题的另一部分,似乎不可能单独做到这一点xspline()。但是,一旦获得曲线值,就可以将模型拟合到曲线的xy值,并从中预测整数值。例如,一个相当简单的模型是黄土曲线。

lo <- loess(y ~ x, data=xs, span=.1)
cor(xs$y, fitted(lo))
# [1] 0.9999994

从上面可以看出,该模型的拟合值与曲线的观测y值的相关性xspline()约为 1。也就是说,黄土模型几乎完美地再现了曲线。现在,您可以预测 x 整数处的黄土曲线值。

pred.dat <- data.frame(x=seq(min(df$ageGroup), max(df$ageGroup), by=1))
fit <- predict(lo, newdata=pred.dat)
pred.dat$fit <- fit
head(pred.dat)
#    x         fit
# 1 11 -0.35999980
# 2 12 -0.17044086
# 3 13  0.01636747
# 4 14  0.19932127
# 5 15  0.37068414
# 6 16  0.49624180

推荐阅读