2015-04-10 3 views
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:

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

Может кто-то помочь мне и дайте мне знать, где я заблудился?

+3

Когда вы получаете ошибки, это помогает включить точное сообщение об ошибке, которое вы получаете. Как насчет только 'logMod = nls (max ~ (a * log10 (RI) + b), data = flow, start = list (a = 0, b = 0))'? При использовании формального синтаксиса лучше избегать '$', и если у вас нет забавных символов для имен, обычно лучше использовать 'a $ b', чем' a $ "b" ' – MrFlick

+0

Это сработало! Спасибо! – Pinus2Quercus

+0

@MrFlick, сообщение как ответ? –

ответ

2

Вы не должны использовать $ при указании данных из data.frame в формуле nls. Вы должны использовать параметр 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"

Кроме того, как отметил Григор, если вы просто делаете лог-преобразование на одном из ваших предикторов, это по существу все еще линейная модель. Вы можете сделать

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

Спасибо, мистер Флик. Любая идея, как я могу построить это на шкале журнала/журнала? – Pinus2Quercus

+1

Это совершенно другой вопрос. Не стоит поднимать новые вопросы в комментариях. Если у вас другая проблема, вы должны открыть новый вопрос. – MrFlick

Смежные вопросы