我试图用我的一些数据绘制洪水频率图表。 以下是我使用的数据类型:
#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函数的示例:
logMod = nls((flow$"max"~(a*log10(flow$"RI")+b)),start = list(a = 0, b = 0))
有人可以帮助我,让我知道我在哪里误入歧途吗?
答案 0 :(得分:2)
在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)