Bir gruplama değişkeninin doğrusal olmayan bir modelle etkisi nasıl test edilir?


15

Doğrusal olmayan bir modelde bir gruplama değişkeninin kullanımı ile ilgili bir sorum var. Nls () işlevi faktör değişkenlerine izin vermediğinden, bir faktörün model uyum üzerindeki etkisini test edip edemeyeceğini anlamaya çalışıyorum. Aşağıda, farklı büyüme tedavilerine (çoğunlukla balık büyümesine uygulanan) bir "mevsimsel von Bertalanffy" büyüme modelini yerleştirmek istediğim bir örnek ekledim. Balığın yetiştiği gölün yanı sıra verilen yiyeceğin etkisini de test etmek istiyorum (sadece yapay bir örnek). Bu soruna geçici bir çözüm var - Chen ve ark. (1992) (ARSS - "Kalan karelerin toplamının analizi"). Başka bir deyişle, aşağıdaki örnek için,

resim açıklamasını buraya girin

Bunu nlme () kullanarak R'de yapmanın daha basit bir yolu olduğunu hayal ediyorum, ama sorunla karşılaşıyorum. Her şeyden önce, bir gruplama değişkeni kullanarak, serbestlik dereceleri, ayrı modellere uydurmamla elde ettiğimden daha yüksektir. İkincisi, gruplama değişkenlerini yuvalayamıyorum - problemimin nerede olduğunu göremiyorum. Nlme veya diğer yöntemleri kullanarak herhangi bir yardım büyük beğeni topluyor. Yapay örneğimin kodu aşağıdadır:

###seasonalized von Bertalanffy growth model
soVBGF <- function(S.inf, k, age, age.0, age.s, c){
    S.inf * (1-exp(-k*((age-age.0)+(c*sin(2*pi*(age-age.s))/2*pi)-(c*sin(2*pi*(age.0-age.s))/2*pi))))
}

###Make artificial data
food <- c("corn", "corn", "wheat", "wheat")
lake <- c("king", "queen", "king", "queen")

#cornking, cornqueen, wheatking, wheatqueen
S.inf <- c(140, 140, 130, 130)
k <- c(0.5, 0.6, 0.8, 0.9)
age.0 <- c(-0.1, -0.05, -0.12, -0.052)
age.s <- c(0.5, 0.5, 0.5, 0.5)
cs <- c(0.05, 0.1, 0.05, 0.1)

PARS <- data.frame(food=food, lake=lake, S.inf=S.inf, k=k, age.0=age.0, age.s=age.s, c=cs)

#make data
set.seed(3)
db <- c()
PCH <- NaN*seq(4)
COL <- NaN*seq(4)
for(i in seq(4)){
    age <- runif(min=0.2, max=5, 100)
    age <- age[order(age)]
    size <- soVBGF(PARS$S.inf[i], PARS$k[i], age, PARS$age.0[i], PARS$age.s[i], PARS$c[i]) + rnorm(length(age), sd=3)
	PCH[i] <- c(1,2)[which(levels(PARS$food) == PARS$food[i])]
	COL[i] <- c(2,3)[which(levels(PARS$lake) == PARS$lake[i])]
	db <- rbind(db, data.frame(age=age, size=size, food=PARS$food[i], lake=PARS$lake[i], pch=PCH[i], col=COL[i]))
}

#visualize data
plot(db$size ~ db$age, col=db$col, pch=db$pch)
legend("bottomright", legend=paste(PARS$food, PARS$lake), col=COL, pch=PCH)


###fit growth model
library(nlme)

starting.values <- c(S.inf=140, k=0.5, c=0.1, age.0=0, age.s=0)

#fit to pooled data ("small model")
fit0 <- nls(size ~ soVBGF(S.inf, k, age, age.0, age.s, c), 
  data=db,
  start=starting.values
)
summary(fit0)

#fit to each lake separatly ("large model")
fit.king <- nls(size ~ soVBGF(S.inf, k, age, age.0, age.s, c), 
  data=db,
  start=starting.values,
  subset=db$lake=="king"
)
summary(fit.king)

fit.queen <- nls(size ~ soVBGF(S.inf, k, age, age.0, age.s, c), 
  data=db,
  start=starting.values,
  subset=db$lake=="queen"
)
summary(fit.queen)


#analysis of residual sum of squares (F-test)
resid.small <- resid(fit0)
resid.big <- c(resid(fit.king),resid(fit.queen))
df.small <- summary(fit0)$df
df.big <- summary(fit.king)$df+summary(fit.queen)$df

F.value <- ((sum(resid.small^2)-sum(resid.big^2))/(df.big[1]-df.small[1])) / (sum(resid.big^2)/(df.big[2]))
P.value <- pf(F.value , (df.big[1]-df.small[1]), df.big[2], lower.tail = FALSE)
F.value; P.value


###plot models
plot(db$size ~ db$age, col=db$col, pch=db$pch)
legend("bottomright", legend=paste(PARS$food, PARS$lake), col=COL, pch=PCH)
legend("topleft", legend=c("soVGBF pooled", "soVGBF king", "soVGBF queen"), col=c(1,2,3), lwd=2)

#plot "small" model (pooled data)
tmp <- data.frame(age=seq(min(db$age), max(db$age),,100))
pred <- predict(fit0, tmp)
lines(tmp$age, pred, col=1, lwd=2)

#plot "large" model (seperate fits)
tmp <- data.frame(age=seq(min(db$age), max(db$age),,100), lake="king")
pred <- predict(fit.king, tmp)
lines(tmp$age, pred, col=2, lwd=2)
tmp <- data.frame(age=seq(min(db$age), max(db$age),,100), lake="queen")
pred <- predict(fit.queen, tmp)
lines(tmp$age, pred, col=3, lwd=2)



###Can this be done in one step using a grouping variable?
#with "lake" as grouping variable
starting.values <- c(S.inf=140, k=0.5, c=0.1, age.0=0, age.s=0)
fit1 <- nlme(model = size ~ soVBGF(S.inf, k, age, age.0, age.s, c), 
  data=db,
  fixed = S.inf + k + c + age.0 + age.s ~ 1,
  group = ~ lake,
  start=starting.values
)
summary(fit1)

#similar residuals to the seperatly fitted models
sum(resid(fit.king)^2+resid(fit.queen)^2)
sum(resid(fit1)^2)

#but different degrees of freedom? (10 vs. 21?)
summary(fit.king)$df+summary(fit.queen)$df
AIC(fit1, fit0)


###I would also like to nest my grouping factors. This doesn't work...
#with "lake" and "food" as grouping variables
starting.values <- c(S.inf=140, k=0.5, c=0.1, age.0=0, age.s=0)
fit2 <- nlme(model = size ~ soVBGF(S.inf, k, age, age.0, age.s, c), 
  data=db,
  fixed = S.inf + k + c + age.0 + age.s ~ 1,
  group = ~ lake/food,
  start=starting.values
)

Referans: Chen, Y., Jackson, DA ve Harvey, HH, 1992. Balık büyüme verilerinin modellenmesinde von Bertalanffy ve polinom fonksiyonlarının karşılaştırılması. 49, 6: 1228-1235'te açıklanmaktadır.

Yanıtlar:


6

X1,...,XpYf

Y=f(X1,...,Xp)+ε

εN(0,σ2)fBmBL1L0

Sınıflandırılmamış model açıkça tabakalı modelin bir alt modelidir, bu nedenle olasılık oranı testi , daha büyük modelin eklenen karmaşıklığa değip değmediğini görmek için uygundur - test istatistiği

λ=2(L1L0)

λχ2mpp=p(m1)pχ2


M ayrı model sığdırmayı, her bir L1 = SUM'dan (LL_i, i 1'den m'ye) günlük olasılığını toplamayı ve daha sonra olabilir mi? Ayrıca, L0 söz konusu kategorik öngörücüyü içeren bir model içeriyor mu (örneğin m-1 kukla değişkenleri ile)?
B_Miner

L0BB

Öneriniz için teşekkürler Makro. Bu, daha önce yaptığımın yönünde gibi görünüyor - F-testinden ziyade olasılık karşılaştırmasını önerseniz de. Örneğimde, F-testi aynı zamanda her bir kategorik öngörü düzeyine uygulanan birkaç uyumdan kalan tekli uyum artıklarını karşılaştırmaktadır. Sanırım, bunu birkaç modele uydurmak yerine tek bir adımda karışık bir model içinde yapıp yapamayacağımı merak ediyordum. Ayrıca, böyle bir strateji iç içe faktör testine izin verir mi?
Marc kutuda

Modelleri karşılaştırmak için çeşitli modellerin takılmasını sağlayabileceğinizi düşünmüyorum. Ayrıca, evet, olasılık oranı testi iç içe faktörleri test etmek için kullanılabilir.
Makro

2

Sadece doğru / yanlış vektörleri denkleminize çarparak kategorik değişkenleri nls () ile kodlamanın mümkün olduğunu buldum. Misal:

# null model (no difference between groups; all have the same coefficients)
nls.null <- nls(formula = percent_on_cells ~ vmax*(Time/(Time+km)),
            data = mehg,
            start = list(vmax = 0.6, km = 10))

# alternative model (each group has different coefficients)
nls.alt <- nls(formula = percent_on_cells ~ 
              as.numeric(DOC==0)*(vmax1)*(Time/(Time+(km1))) 
            + as.numeric(DOC==1)*(vmax2)*(Time/(Time+(km2)))
            + as.numeric(DOC==10)*(vmax3)*(Time/(Time+(km3)))
            + as.numeric(DOC==100)*(vmax4)*(Time/(Time+(km4))),
            data = mehg, 
            start = list(vmax1=0.63, km1=3.6, 
                         vmax2=0.64, km2=3.6, 
                         vmax3=0.50, km3=3.2,
                         vmax4= 0.40, km4=9.7))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.