2016-12-22 16 views
2

я пытаюсь оценить, если различные популяции достигают различную асимптоту с помощью NLS, в R. Здесь у меня есть два data.frames DF1 имеет только одну популяции (в лице сайта)Оценка асимптоты в R NLS для нескольких факторов

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", 
"ALT02", "ALT03", "Cotton", "Deep", "Eckhardt", "Green", "Johnson", 
"Kissinger", "Marsh", "Sand", "Shypoke", "Sora", "Spike", "Tamora", 
"WRP01", "WRP05", "WRP08", "WRP10", "WRP11", "WRP12", "WRP14", 
"WRP15", "WRP18"), 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") 

и df2 должен населения (опять представленных Site)

df2 <- structure(list(Site = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("ALT01", 
"ALT02", "ALT03", "Cotton", "Deep", "Eckhardt", "Green", "Johnson", 
"Kissinger", "Marsh", "Sand", "Shypoke", "Sora", "Spike", "Tamora", 
"WRP01", "WRP05", "WRP08", "WRP10", "WRP11", "WRP12", "WRP14", 
"WRP15", "WRP18"), class = "factor"), Nets = c(1L, 2L, 3L, 4L, 
5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 
1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 
15L, 16L, 17L, 18L), Cumulative.spp = c(12L, 13L, 15L, 17L, 17L, 
17L, 17L, 19L, 19L, 19L, 19L, 20L, 22L, 22L, 22L, 22L, 22L, 22L, 
7L, 10L, 11L, 12L, 13L, 14L, 14L, 14L, 15L, 15L, 16L, 16L, 16L, 
16L, 16L, 17L, 17L, 17L)), .Names = c("Site", "Nets", "Cumulative.spp" 
), row.names = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 
12L, 13L, 14L, 15L, 16L, 17L, 18L, 25L, 26L, 27L, 28L, 29L, 30L, 
31L, 32L, 33L, 34L, 35L, 36L, 37L, 38L, 39L, 40L, 41L, 42L), class = "data.frame") 

Когда я модель для одной популяции все выглядит отлично:

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

То, что я пытаюсь сделать, это увидеть, если я могу добавить несколько популяций к одной и той же модели и добавить переменный сайт, я попытался это:

Model2<-nls(Cumulative.spp ~ SSasympOff(Nets, A, lrc, c0) + Site , data = df2) 

и это:

Model2<-nls(Cumulative.spp ~ SSasympOff(Nets + Site , A, lrc, c0), data = df2) 

Но пока не повезло, любая помощь будет оценена по достоинству.

+0

проверить 'nlme :: gnls()' и, в частности, аргумент 'params' ... –

+0

Спасибо @BenBolker Я пытался понять документацию« params », и хотя в ней говорится, что для разных моделей для каждого parameter_ Я не нашел никакого примера о том, как это сделать, не могли бы вы мне немного помочь? –

+1

что-то примерно похоже на 'gnls (Cumulative.spp ~ SSasympOff (Nets, A, lrc, c0), params = Nets ~ Site, data = df2)' (если вы хотите, чтобы эффект 'Nets' изменялся на разных сайтах) или 'params = Nets + A + lrc + c0 ~ Site', если вы хотите, чтобы все параметры менялись (хотя в этом случае вы могли бы просто разделить данные и поместиться каждый сайт отдельно, единственная (?) разница была бы объединенной и сравнимой -специфическая оценка остаточной дисперсии) –

ответ

2

Мы предполагаем, что вы хотите иметь разные параметры Asym для двух популяций, но общие параметры lrc и c0.

Сначала в (1) мы покажем, как изменить решение в вопросе, чтобы получить ответ. Большая часть кода в (1) - это просто получить начальные значения, но фактическая подгонка - это только одна строка кода - две строки, если вы считаете, что мы определили формулу в отдельной строке.

Затем в (2) показано, как упростить (1) с помощью алгоритма "plinear", исключая необходимость получения начальных значений для линейных параметров. В (2a) мы покажем дополнительное упрощение, которое легче распространяется на большее количество сайтов и в (2b), мы упрощаем это далее при условии присутствия всех сайтов (что не имеет места в вопросе, но может иметь место в реальном данные).

1) алгоритм по умолчанию Мы можем получить начальные значения в nls подгонкой каждой популяции отдельно (fm1, fm2) и вместе (fm3). Наконец, подгоняем модель с различными параметрами Asym (fm4).

# get starting values 
fo <- Cumulative.spp ~ SSasympOff(Nets, A, lrc, c0) 
fm1 <- nls(fo, df2, subset = Site == "ALT01") 
fm2 <- nls(fo, df2, subset = Site == "ALT03") 
fm3 <- nls(fo, df2) 
st <- c(A1 = coef(fm1)[["A"]], A2 = coef(fm2)[["A"]], coef(fm3)[c("lrc", "c0")]) 

# fit  
fo4 <- Cumulative.spp ~ SSasympOff(Nets, A1*(Site=="ALT01")+A2*(Site=="ALT03"), lrc, c0) 
fm4 <- nls(fo4, data = df2, start = st) 

plot(Cumulative.spp ~ Nets, df2, col = Site) 
points(fitted(fm4) ~ Nets, df2, col = "red", pch = 20) 

screenshot

2) plinear На самом деле Asym особый, так как модель является линейной в нем, и мы можем использовать это, чтобы упростить выше, как нам не нужны начальные значения для линейных параметров, если мы переключаемся на algorithm="plinear". Это устраняет необходимость запуска fm1 и fm2. Нам нужно только fm3 для генерации начальных значений. Обратите внимание, что "plinear" требует, чтобы RHS формулы была матрицей с каждым столбцом, умножающим коэффициент на один линейный параметр. Здесь мы имеем два линейных параметра (Asym для каждого Site), поэтому это двухколоночная матрица.

# get starting values 
fo <- Cumulative.spp ~ SSasympOff(Nets, A, lrc, c0) 
fm3 <- nls(fo, df2)  
st5 <- coef(fm3)[c("lrc", "c0")] 

# fit 
mm <- with(df2, cbind(Site=="ALT01", Site=="ALT03")) 
fo5 <- Cumulative.spp ~ mm * SSasympOff(Nets,1,lrc,c0) 
fm5 <- nls(fo5, data = df2, start = st5, algorithm = "plinear") 

2a)mm альтернативно может быть записана следующим образом, который имеет то преимущество, что она простирается на большее число участков:

mm <- model.matrix(~ Site - 1, transform(df2, Site = droplevels(Site))) 

2b) Если все уровни Site фактора представлены в данные тогда мы могли бы упростить еще больше, так как droplevels(Site) (который снижает неиспользуемые уровни) мог бы быть просто Site, что позволяет нам написать:

mm <- model.matrix(~ Site - 1, df2) 

Обновление: Некоторые исправления и улучшения.

+0

, он отлично поработал, спасибо. если не слишком много проблем, вы можете удалить первую часть, я чувствую, что с помощью 'mm <- model.matrix (~ Site-1, transform (df2, Site = droplevels (Site))) fo5 <- Совокупный. spp ~ mm * SSasympOff (Nets, 1, lrc, c0) ', вместе с then'fm5 <- nls (fo5, data = df2, start = st5, algorithm =" plinear ")' будет делать это, hte первая часть может путайте людей, спасибо –

+1

Я добавил заголовки. –

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

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