创建拟合的对数模型

时间:2015-04-10 18:58:36

标签: 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)
#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))

有人可以帮助我,让我知道我在哪里误入歧途吗?

1 个答案:

答案 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$ba$"b"

略有不同

另外,正如@Gregor指出的那样,如果你只是对你的一个预测变量进行日志变换,这基本上仍然是一个线性模型。你可以做到

lm( max ~ log10(RI), data=flow)