【问题标题】:Predict for wider range预测范围更广
【发布时间】:2026-01-18 23:15:01
【问题描述】:

我想拟合数据并预测更宽 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)

错误(函数(...,row.names = NULL,check.rows = FALSE, check.names = TRUE, : 参数暗示不同的行数: 20, 150

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

类似的帖子

using-predict-in-nls

trouble-with-predict-function-in-r

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

【问题讨论】:

  • 你需要调用cc$mod而不是mod吗?
  • @troh 当我尝试 cc$mod 时,Error in predict(mod, newdata = new.range) : object 'mod' not found

标签: r predict nls


【解决方案1】:

这是实现你想要的东西。您最初问题的原因是,在您的回归中,预测变量的名称是 Sepal.width 而不是 x,并且您的预测根本不使用您的 new.range,因此您必须执行类似 new.range&lt;- 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)

【讨论】:

  • 感谢您的出色回答。 OTH,在我的真实数据中,每组的长度是不同的!在iris 数据集中,每个物种有 50 行。当我们设置 length.out=50 时很好。但是,在我的真实数据中,有一些组的行大小为 100 或 160。所以我不能为它们使用相同的 length.out 参数。您对此有什么建议吗?
  • @Alexander 欢迎您。如果行大小不同,可以将 50 替换为 nrow(.),应该可以。