R 创建拟合对数模型
我正在用我掌握的一些数据绘制洪水频率图。 以下是我正在处理的数据类型:R 创建拟合对数模型,r,R,我正在用我掌握的一些数据绘制洪水频率图。 以下是我正在处理的数据类型: #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)
#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公式中指定data.frame中的数据时,不应使用
$
。您应该使用data=
参数指定用于查找变量值的data.frame。因此,您应该将呼叫更改为
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$b
与a$“b”
此外,正如@Gregor所指出的,如果你只是对一个预测值进行对数变换,这基本上仍然是一个线性模型。你能行
lm( max ~ log10(RI), data=flow)
当您收到错误时,它有助于包含您收到的确切错误消息。只需
logMod=nls(max~(a*log10(RI)+b),data=flow,start=list(a=0,b=0))
?使用公式语法时,最好避免使用$
,除非名称中有有趣的字符,否则通常使用a$b
比使用a$“b”
更好!谢谢大家!@Flick先生,作为答案发布?还有。。。没有理由对线性模型使用nls
。谢谢Flick先生。你知道我该如何在对数/对数尺度上绘制这个图吗?这是一个完全不同的问题。在评论中提出新问题不是个好主意。如果你有不同的问题,你应该提出一个新问题。
lm( max ~ log10(RI), data=flow)