2016-12-28 11 views
0

У меня есть следующие dataframe:как получить geom_smooth для функции NLS assymptote с помощью SSasympOff

df1<- structure(list(Site = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("ALT01"), class = "factor"), Nets = 1:18, Cumulative.spp = c(12L,13L, 15L, 17L, 17L, 17L, 17L, 19L, 19L, 19L, 19L, 20L, 22L, 22L, 22L, 22L, 22L, 22L)), .Names = c("Site", "Nets", "Cumulative.spp"), row.names = c(NA, 18L), class = "data.frame") 

, и я пытаюсь получить ggplot2 сюжет с ответом geom_smooth этой функции:

Model1<-nls(Cumulative.spp ~ SSasympOff(Nets, A, lrc, c0), data = df1) 

как правило, если у меня была модель так:

Model2 <- lm(Cumulative.spp ~ I(log(Nets), data = df1) 

Я попробовал два метода

Метод 1

Я хотел бы сделать это:

library(ggplot2) 

ggplot(df1, aes(x=Nets, y = Cumulative.spp)) + geom_point() + geom_smooth(method="lm", formula=y~log(x), fill="blue", fullrange=T) 

enter image description here

, но когда я пытаюсь сделать то же самое с assymptote он не работает:

ggplot(df1, aes(x=Nets, y = Cumulative.spp)) + geom_point() + geom_smooth(method="nls", formula=y~SSasympOff(x, A, lrc, c0), color="blue", fullrange=T) 

, но я получил эту ошибку и этот участок:

Warning message: 
Computation failed in `stat_smooth()`: 
$ operator is invalid for atomic vectors 

enter image description here

Method2

Я попытался прогнозирования по сравнению с первоначальным dataframe, чтобы получить доверительный интервал и с помощью geom_line над предсказанными значениями и geom_ribbon на интервале, но когда я делаю

predict(Model1, df1, interval = "confidence") 

, но я не получаю доверительный интервал, только t он предсказал значение

любой помощи будет оценен

+0

Почему не просто добавьте предсказанные значения, используя 'geom_line', а затем интервал, используя' geom_ribbon'? – bouncyball

+0

hi @bouncyball Я пытался это сделать, но я не получаю интервал, я пробовал «предсказать (Model1, df1, interval =« доверие »)' как то, что я нашел в документации 'predict.nls', но это не дает мне доверительный интервал, я добавлю это к тому, что я пробовал в вопросе. –

+0

, возможно, вы можете использовать метод bootstrap percentile, тогда ... не понимали, что получение доверительных интервалов будет настолько сложным с 'nls'. Моя ошибка – bouncyball

ответ

1

Я думал, так как я предложил самозагрузки метод, который я мог бы продемонстрировать. В этом случае мы будем расшифровывать остатки (see Wikipedia for more information). Я не слишком хорошо знаком с использованием nls, так что кто-то может прийти (теоретическое возражение).

B <- 2500 # bootstrap iterations, big number 
pred_mat <- matrix(0, nrow = 18, ncol = B) # initialize matrix 
# extract residuals and predictions from original model 
resids <- residuals(Model1) 
preds <- predict(Model1) 
df1$Pred <- preds 
for(i in 1:B){ 
    # bootstrapped dependent variable 
    new_y <- preds + sample(resids, replace = TRUE) 
    df1$NewY <- new_y 
    # fit model 
    Model_Boot <- nls(NewY ~ SSasympOff(Nets, A, lrc, c0), data = df1) 
    # extract predictions 
    pred_mat[,i] <- predict(Model_Boot) 
} 

# add 2.5% and 97.5% percentile intervals to df1 
df1 <- cbind(df1, t(apply(pred_mat, 1, FUN = function(x) quantile(x, c(.025, .975))))) 
# rename appropriately 
names(df1)[6:7] <- c('lower','upper') 

# make plot 
ggplot(df1, aes(x = Nets))+ 
    geom_point(aes(y = Cumulative.spp))+ 
    geom_line(aes(y = Pred))+ 
    geom_ribbon(aes(ymin = lower, ymax = upper), 
       alpha = .2, fill = 'blue') 

enter image description here

0

Я нашел способ сделать это, что я думаю, что это немного более простым, чем bouncyballs один, но я дам вам всем судить лучший ответ, хотя я upvote ответ bouncyball в ,

Об этом я нашел old post, но не смог найти.функция ой в NLS2, то я нашел этот link с функцией, и я решил использовать as.lm.nls функции

ggplot(df1, aes(x=Nets, y = Cumulative.spp)) + geom_point() + geom_line(y = predict(as.lm.nls(Model1), interval = "confidence")[,1]) + geom_ribbon(ymax = predict(as.lm.nls(Model1), interval = "confidence")[,3], ymin = predict(as.lm.nls(Model1), interval = "confidence")[,2], fill = "blue", alpha = 0.5) 

и я получил этот результат быстрее, чем при использовании самозагрузки подхода

enter image description here

+0

К сожалению, функция 'as.lm.nls' для линеаризации nls, которая была в nls2 0.1.3, как представляется, генерирует множество запросов поддержки, поскольку она не работает так, как ожидают некоторые люди. Это не недостаток в том, как реализовано «as.lm.nls», но непонимание того, как весь этот предмет работает со многими людьми, поэтому я решил, что лучше всего удалить эту функцию. –

+0

@ G.Grothendieck Мне очень понравилось, как это работает, это намного проще, чем самонастройка, я вынул его из ссылки выше. Можете ли вы рекомендовать цитату из математического процесса, используемого для линеаризации NLS, я хотел бы узнать больше об этом. –

+0

Существует книга Дуга Бейтса, в которой обсуждается это. –

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

  • Нет связанных вопросов^_^