我试图将观察值绘制为与预期值相对应的点,如下所示:
d <- data.frame(
ranks = 1:9,
observed = c(0.736, 0.121, 0.067, 0.034, 0.026, 0.015, 0.001, 0.001, 0.000),
expected = c(0.735, 0.136, 0.051, 0.025, 0.015, 0.009, 0.006, 0.005, 0.003)
)
ggplot(d, aes(x=ranks, y=observed)) +
geom_point(size=2.2) +
geom_line(aes(x=ranks, y=expected), size=0.8, colour='red')
这是正确的,但我更喜欢让线条很好地平滑(没有肘部)。将geom_smooth()
与loess
或gam
一起使用并没有真正帮助,因为两者都过度平滑(以不同的方式)。有什么建议吗?
更新:如果这有用,请按照以下方法生成预期值:
# BACIS POWER FUNCTION:
fPow <- function(x, a, b) {a * x^b}
# INITIALIZE PARAMETERS:
est1 <- coef(nls(observed ~ fPow(ranks, a, b),
start=c(a=1, b=1), data=d))
# FITTING:
nlfit1 <- nls(observed ~ fPow(ranks, a, b),
start=est1, data=d)
# EXPECTED VALUES:
expected <- predict(nlfit1)
答案 0 :(得分:4)
您可以尝试的一种解决方案是强制执行预期点的样条曲线:
library(ggplot2)
library(ggalt)
d <- data.frame(
ranks = 1:9,
observed = c(0.736, 0.121, 0.067, 0.034, 0.026, 0.015, 0.001, 0.001, 0.000),
expected = c(0.735, 0.136, 0.051, 0.025, 0.015, 0.009, 0.006, 0.005, 0.003)
)
ggplot(d, aes(x = ranks, y = observed)) +
geom_point(size = 2.2) +
geom_xspline(aes(y = expected), size = 0.8,
spline_shape = -.15, colour = 'red')
这种方法总是有效,但我不是数据可视化样条的忠实粉丝,因为它们构成了我们没有的数据。
我认为更好的方法是插入小数等级的预测公式:
fPow <- function(x, a, b) {a * x^b}
est1 <- coef(nls(observed ~ fPow(ranks, a, b),
start=c(a=1, b=1), data=d))
nlfit1 <- nls(observed ~ fPow(ranks, a, b),
start=est1, data=d)
d2 <- data.frame(ranks = seq(1, 9, by = 0.1))
expected <- predict(nlfit1, d2)
d2 <- data.frame(d2, expected)
ggplot(d, aes(x = ranks, y = observed)) +
geom_point(size = 2.2) +
geom_line(data = d2, aes(x = ranks, y = expected), size = 0.8, colour = 'red')