预测范围更广

Predict for wider range

我想拟合数据并预测更宽 x 范围的 y 值。

假设我有 'iris' 数据集,并使用以下数据根据此 post

进行预测
 library(dplyr)
 cc <- iris %>%
  group_by(Species) %>%
  do({
    mod <- nlsLM(Sepal.Length ~ k*Sepal.Width/2+U, start=c(k=10,U=5), data = ., trace=F, control = nls.lm.control(maxiter=100))
    pred <- predict(mod, newdata =.["Sepal.Width"])
    data.frame(., pred)
  })

这是拟合图

我想用更宽的 Sepal width 范围拟合此数据,这样

new.range<- data.frame(x=seq(2,10,length.out=20))

并修改脚本

 pred <- predict(mod, newdata =new.range)

绘制new.range拟合

library(ggplot2)

ggplot(cc,aes(y=Sepal.Length,x=Sepal.Width ,col=factor(Species)))+
  geom_point()+
  facet_wrap(~Species)+
  geom_line(aes(x=new.range,y=pred),size=1)

Error in (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE, : arguments imply differing number of rows: 20, 150

我不明白为什么会出现这个错误。我想 pred 是根据 new.range 计算的,所以它们应该具有相同的长度?

类似帖子

using-predict-in-nls

trouble-with-predict-function-in-r

predict-maybe-im-not-understanding-it?

这就是你想要的东西。你原来的问题的原因是在你的回归中,预测器的名字是 Sepal.width 而不是 x,你的预测根本没有使用你的 new.range,所以你必须做一些事情喜欢 new.range<- data.frame(Sepal.Width=seq(2,10,length.out=50)) 来预测你的 new.range

另一个问题是你必须让 new.range 的长度为 50,这样 prednew.range 才能适合原来的 data.frame。

然后就可以画出你想要的情节了,注意new.range变成了Sepal.Width.1

library(dplyr)
cc <- iris %>%
    group_by(Species) %>%
    do({
        mod <- nlsLM(Sepal.Length ~ k*Sepal.Width/2+U, start=c(k=10,U=5), data = ., trace=F, control = nls.lm.control(maxiter=100))
        new.range<- data.frame(Sepal.Width=seq(2,10,length.out=50))
        pred <- predict(mod, newdata =new.range)
        # pred <- predict(mod, newdata =.["Sepal.Width"])
        data.frame(., new.range, pred)

    })

library(ggplot2)

ggplot(cc,aes(y=Sepal.Length,x=Sepal.Width ,col=factor(Species)))+
    geom_point()+
    facet_wrap(~Species)+
    geom_line(aes(x=Sepal.Width.1,y=pred),size=1)