【问题标题】:How to find a curve that fits a series of points on the R?如何找到适合 R 上一系列点的曲线?
【发布时间】:2020-07-07 12:51:36
【问题描述】:

我需要找出适应某种疾病每天污染的幂曲线方程,以便我可以做出预测,数据如下:

Day     Contaminated

26/feb  1
29/feb  2
04/mar  3
05/mar  8
06/mar  13
07/mar  19
08/mar  25
10/mar  34
11/mar  52
12/mar  81
13/mar  98
14/mar  121
15/mar  176
16/mar  234
17/mar  291
18/mar  428
19/mar  621
20/mar  904
21/mar  1128
22/mar  1546
23/mar  1891
24/mar  2201
25/mar  2433

我认为我需要在 R 中做一个幂曲线回归(NonLinearRegression),但我不知道如何实现它。

【问题讨论】:

  • 很难证明您已经进行了足够的研究,但我认为您在来到 SO 之前没有做任何研究。在谷歌上,我在搜索中包含"r" 和/或"CRAN"(有意引用);我偶尔使用rseek.org;在 SO 上,一个 must 使用 include [r] 仅在 r 标记内搜索(其他标记可能有用)。重要的是,我们绝对希望您在来这里之前做好功课。明白我们的时间不是免费的,尽管我们不收费。回答低质量、研究不足或受骗的问题会变得很烦人。
  • 我完全理解,可能看起来不像,但我研究了一天。我来自葡萄牙论坛,我搜索了一遍,没有发现如何进行这种回归。我真的需要帮助,如果它看起来像别的东西,很抱歉。
  • 明确地说,这是一个关于高级统计的通用问题;它不是关于编程(除了“如何编程这个回归”),也不是关于你建立的特定模型的问题(应该迁移到Cross Validated)。我不知道有任何 StackExchange 站点旨在用作完整的教程课程计划,SO 也不例外。虽然许多答案确实有足够的细节可以用作迷你操作指南等,但我相信那是例外。要求这么多是题外话,请参阅help center
  • 您心中的具体方法是什么? R 只是实现它的一种方式。在这里,您一定会找到有关 R 特定的帮助,或者如果您想了解有关 R 的更多信息。所以如果您想了解更多信息,恐怕您可能不在正确的地方。我会建议。 [en.wikipedia.org/wiki/Bass_diffusion_model][this] 或这个 [homes.stat.unipd.it/renatoguseo/content/ricerca](this)。走得太快,路可能很长;-)
  • 感谢 DJJ 的文章,我会进一步搜索。我想在 R 中使用非线性回归,更准确地说是功率曲线回归。我查看了无数关于 R 中的非线性回归、曲线拟合和幂曲线的文章,但我无法用我的数据在 R 中实现它。

标签: r regression non-linear-regression


【解决方案1】:

这是一种使用data.tableggplot2nls 的方法。

首先,让我们将日期固定为标准格式并转换为整数,以便我们进行一些计算。

library(data.table)
library(ggplot2)
setDT(data)
data[,Day:= as.Date(Day,"%d/%b")]
data[,Int := as.integer(Day)-min(as.integer(Day))]

然后我们使用nls 将模型拟合到数据中。我们将使用公式y = a * x ^ b

nls(formula = Contaminated ~ a * Int ^ b, data,start=list(a=1,b=1))
# Nonlinear regression model
#  model: Contaminated ~ a * Int^b
#   data: data
#        a         b 
#2.272e-05 5.571e+00 
# residual sum-of-squares: 123279
#
#Number of iterations to convergence: 48 
#Achieved convergence tolerance: 7.832e-07

现在我们可以使用ggplot查看结果。

ggplot(data, aes(x=Int,y=Contaminated)) + 
  geom_point() +
  scale_x_continuous(breaks = c(0,10,20), labels = data$Day[data$Int %in% c(0,10,20)]) + xlab("Date") +
  geom_smooth(method="nls", formula = y ~ a * x ^ b,method.args = list(start = c(a=1, b=1)),se=FALSE, linetype = 1)

数据

data <- structure(list(Day = c("26/feb", "29/feb", "04/mar", "05/mar", 
"06/mar", "07/mar", "08/mar", "10/mar", "11/mar", "12/mar", "13/mar", 
"14/mar", "15/mar", "16/mar", "17/mar", "18/mar", "19/mar", "20/mar", 
"21/mar", "22/mar", "23/mar", "24/mar", "25/mar"), Contaminated = c(1L, 
2L, 3L, 8L, 13L, 19L, 25L, 34L, 52L, 81L, 98L, 121L, 176L, 234L, 
291L, 428L, 621L, 904L, 1128L, 1546L, 1891L, 2201L, 2433L)), class = "data.frame", row.names = c(NA, 
-23L))

【讨论】:

  • 首先感谢您的帮助,真的!但是我根本没有将代码放到我的 R 中。通过传递“nls (formula = Contaminated ~ a * Int ^ b, data, start = list (a = 1, b = 1))”我得到了迭代超过最大值 50 的错误。
  • 确保您使用的 data 与我在答案末尾提供的相同。另外,你可以试试stats::nls(formula = Contaminated ~ a * Int ^ b, data,start=list(a=1,b=1))
  • 我使用了提供的数据以及评论中提供的公式,但错误仍然存​​在
  • 嗨@Magliari,为了确保它正常工作,我登录到我医院的Linux集群并在那里运行代码。如您所见,it works。我建议您缓慢地依次执行前面带有&gt;+ 的代码行。
  • 非常感谢您发送打印的代码。我将它正确复制到我的 R 中,但错误仍然存​​在。对 Cotinua 来说,迭代次数超过了最大值 50。我无数次将他的代码转移到我的 R 中。我的代码:link。很抱歉给您带来不便,但我很感兴趣。
猜你喜欢
  • 2020-02-13
  • 1970-01-01
  • 1970-01-01
  • 2019-12-16
  • 2019-11-26
  • 1970-01-01
  • 1970-01-01
  • 2013-12-31
  • 2021-04-02
相关资源
最近更新 更多