创建拟合的对数模型

3

我正在尝试使用一些数据绘制洪水频率图。 以下是我正在使用的数据类型:

#Set up maximum flow data
flow=sample(seq(10,1000,20),100,replace=TRUE)
flow=as.data.frame(flow[order(flow, decreasing=TRUE)])
names(flow)="max"
#rank flows from largest to smallest
flow$"rank"=seq(1,nrow(flow),1)
#Calculate the return interval in years
flow$"RI"=(nrow(flow)+1)/flow$"rank"
plot(flow$"max"~flow$"RI",type='p',log='xy', xlab='Return Interval', ylab='Max flow')

现在我们已经有了每年的最大流量记录和循环间隔的估计。现在我想找到最佳拟合的对数线。我一直在尝试使用nls函数进行操作,但是一直出现错误。

Error in parse(text = x) : <text>:2:0: unexpected end of input
1: ~ 
   ^

以下是我使用nls函数的示例:

这里是我使用nls函数的样本:

logMod = nls((flow$"max"~(a*log10(flow$"RI")+b)),start = list(a = 0, b = 0))

有人能帮我了解一下我错在哪里吗?

这段内容与 IT 技术无关。

3
当你遇到错误时,包括具体的错误信息会有所帮助。试试只写logMod = nls(max~(a*log10(RI)+b),data=flow, start = list(a = 0, b = 0))?使用公式语法时,最好避免使用$,除非你的变量名有奇怪的字符,通常最好使用a$b而不是a$"b" - MrFlick
成功了!谢谢你! - Pinus2Quercus
@MrFlick,以答案的形式发布? - Ben Bolker
此外,对于线性模型来说,没有使用nls的理由。 - Gregor Thomas
1个回答

2

在nls公式中,指定数据框中的数据时不应使用$。您应该使用data=参数来指定要使用哪个数据框来查找变量值。因此,您应该更改调用方式为

logMod = nls( max ~ (a*log10(RI)+b), data=flow, 
    start = list(a = 0, b = 0))

问题似乎是由于使用 a$"b" 而不是更常见的 a$b 导致的。 nls() 使用 all.vars() 提取变量名。请注意。
all.vars(flow$"max" ~ (a * log10(flow$"RI") + b))
# [1] "flow" "a"    "b"   
all.vars(flow$max ~ (a * log10(flow$RI) + b))
# [1] "flow" "max"  "a"    "RI"   "b"

这是因为当你使用引号时,你不再将你的列指定为all.vars()要查找的符号/名称,而是将它们作为字符值传递,这些字符值不会被提取。因此,在这种情况下,a$ba$"b"略有不同。
另外,正如@Gregor所指出的,如果你只对一个预测变量进行对数转换,那么这基本上仍然是一个线性模型。你可以这样做:
lm( max ~ log10(RI), data=flow)

谢谢您,MrFlick。您有什么想法可以帮我在对数坐标轴上绘制这个图吗? - Pinus2Quercus
1
那是完全不同的问题。在评论中提出新问题并不是一个好主意。如果你有其他问题,应该开一个新的提问。 - MrFlick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接