【问题标题】:Error with pred$fit using nls in ggplot2在 ggplot2 中使用 nls pred$fit 出错
【发布时间】:2019-12-06 15:26:14
【问题描述】:

所以我在 ggplot2 中使用 nls 来绘制功率曲线代码如下:

mass <- c(4120,4740,5550,5610,6520,6870,7080,8500,8960,10350,10480,10550,11450,11930,12180,13690,13760,13800,14050,14700,15340,15790,15990,17300,18460,18630,18650,20050,23270,24530,25030,27540,28370,33460,33930,34450,34500)

solv_acc <- c(2760,2990,2990,3180,3900,4010,4140,4680,4750,5330,4980,5860,5930,5570,5910,6790,6690,7020,6240,6620,6600,6860,7940,7600,8250,8530,7410,9160,9140,10300,10440,10390,11020,12640,11920,12110,12650)

df <- data.frame(Mass=log(mass),Solv=log(solv_acc))

plotter <- (ggplot(df, aes(x=Mass, y=Solv)) + geom_point(shape=1) + stat_smooth(method = "nls", formula = y~i*x^z, start=list(i=1,z=0.2)))
plotter <-  plotter + labs(x = "Mass kDa" ,y = "Solvent Accessibility")
print(plotter)

运行上面的代码我得到以下错误:

Error in pred$fit : $ operator is invalid for atomic vectors

我假设当它尝试使用predict()时会发生错误?

当我在同一数据帧上不使用 ggplot2 执行 nls 时,我没有收到错误

> nls1=nls(Solv~i*Mass^z,start=list(i=1,z=0.2),data=df)
> predict(nls1)
 [1] 7.893393 7.997985 8.115253 8.123230 8.234519 8.273135 8.295350 8.429871 8.468550 8.574147 8.583270 8.588134 8.647895 8.677831 8.692939 8.777944 8.781648 8.783757 8.796793 8.829609
[21] 8.860502 8.881445 8.890558 8.947512 8.994380 9.000995 9.001769 9.053953 9.161073 9.198919 9.213390 9.281841 9.303083 9.420894 9.430834 9.441670 9.442703

谁能指出我收到错误的原因?

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    您的问题已在 ggplot2 邮件列表上的 question 中得到解答。简而言之,

    根据 predict.nls 的文档,它无法创建 预测的标准误差,因此必须在 stat_smooth 调用。 .

    所以,我们需要关闭标准错误:

    ggplot(df, aes(x=Mass, y=Solv)) +
      stat_smooth(method="nls", formula=y~i*x^z, se=FALSE, 
                  start=list(i=1,z=0.2)) +
      geom_point(shape=1) 
    

    2019 年更新:对于新版本的 ggplot2,我们需要像这样传递 nlsstart 参数:

    ggplot(df, aes(x = Mass, y = Solv)) +
      stat_smooth(method = "nls", 
                  se = FALSE,
                  method.args = list( 
                    formula = y ~ i*x^z, 
                    start = list(i=1, z=2)
                  )) +
      geom_point()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-21
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多