使用ggplot2绘制受限制的立方样条时出现错误

3

我想使用ggplot2来使用geom_smooth()绘制受限制的立方样条拟合,但似乎它的工作不正确。这是一个简短的例子:

# rms package Contains Restricted Cubic Splines (RCS)
library(rms)
library(ggplot2)

# Load Data
data(cars)

# Model Fit with RCS
fit <- lm(speed ~ rcs(dist, 5), data=cars)

# Obtain Diagnostic Data
plot.dat <- cbind(cars, fitted=fitted(fit))

# Compare Smooth to Actual
ggplot(data=plot.dat) +
  geom_point(aes(x=dist, y=speed)) +
  geom_smooth(aes(x=dist, y=speed), method="lm", 
              formula=y ~ rcs(x, 5), se=FALSE, colour="blue") +
  geom_line(aes(y=fitted, x=dist), size=1.25, colour="red")

这会产生以下图像:样条线比较。我不确定为什么geom_smooth()没有给出正确的结果。显然有一种解决方法(如上所示),但是否有办法使geom_smooth()产生正确的结果呢?

我想知道这是否容易?rcs函数是“rms”世界的一部分。与“ggplot2”世界函数的情况一样,“rms”函数期望环境中提供其他辅助函数和结构。ols函数有单独的“Predict”方法,类似于lm。这需要指定一个datadist对象作为选项。当我运行Predict(ols(speed ~ rcs(dist, 5),data=cars))时,我得到与您的“fitted”相同的结果。当我尝试将“ols”作为方法提供给geom_smooth时,我会收到一个错误。 - IRTFM
我没有意识到有一个ggplot.Predict函数:一个未解答的问题,设置了一个示例:http://stackoverflow.com/questions/33039815/cropped-plot-from-ggplot-predict - IRTFM
2个回答

2

我不知道如何将这个与geom_smooth整合,但我可以使用rms包中的ggplot.Predict完成:

ddist <- datadist(cars)
options(datadist='ddist')

fit <- ols(speed~  rcs(dist,5),data=cars,
               x=TRUE, y=TRUE)

ggplot(Predict(fit))+geom_point(data=cars, aes(x=dist, y=speed))

enter image description here


1

经过很长时间,我终于意识到了问题,并且想在这里发帖给那些有兴趣的人。在内部,geom_smooth()会创建一个预测响应绘制的预测器序列。由于该序列跨越x轴范围,因此geom_smooth()内部选择的节点点将与原始数据上rcs()所选择的节点点不同。为解决这个问题,您需要传入正确的节点点。

# rms package Contains Restricted Cubic Splines (RCS)
library(rms)
library(ggplot2)

# Load Data
data(cars)

# Model Fit with RCS
fit <- lm(speed ~ rcs(dist, 5), data=cars)

# Obtain Diagnostic Data
plot.dat <- cbind(cars, fitted=fitted(fit))

# Compare Smooth to Actual
ggplot(data=plot.dat) +
  geom_point(aes(x=dist, y=speed)) +
  geom_smooth(aes(x=dist, y=speed), method="lm", 
              formula=y ~ rcs(x, quantile(plot.dat$dist, probs = c(0.05, 0.275, 0.5, 0.725, 0.95))), se=FALSE, colour="blue") +
  geom_line(aes(y=fitted, x=dist), colour="red")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接