Làm thế nào để kiểm tra ảnh hưởng của biến nhóm với mô hình phi tuyến tính?


15

Tôi có một câu hỏi liên quan đến việc sử dụng biến nhóm trong mô hình phi tuyến tính. Vì hàm nls () không cho phép các biến nhân tố, tôi đã phải vật lộn để tìm hiểu xem liệu người ta có thể kiểm tra ảnh hưởng của một yếu tố đối với mô hình phù hợp hay không. Tôi đã bao gồm một ví dụ dưới đây nơi tôi muốn điều chỉnh mô hình tăng trưởng "theo mùa von vonalanalanffy" cho các phương pháp điều trị tăng trưởng khác nhau (thường được áp dụng nhất cho sự phát triển của cá). Tôi muốn kiểm tra tác động của hồ nơi cá lớn lên cũng như thức ăn được đưa ra (chỉ là một ví dụ nhân tạo). Tôi quen thuộc với một cách giải quyết cho vấn đề này - áp dụng mô hình so sánh thử nghiệm F phù hợp với dữ liệu gộp so với phù hợp riêng biệt như được phác thảo bởi Chen et al. (1992) (ARSS - "Phân tích tổng bình phương còn lại"). Nói cách khác, ví dụ dưới đây,

nhập mô tả hình ảnh ở đây

Tôi tưởng tượng có một cách đơn giản hơn để làm điều này trong R bằng cách sử dụng nlme (), nhưng tôi đang gặp vấn đề. Trước hết, bằng cách sử dụng biến nhóm, mức độ tự do cao hơn mức tôi có được với các mô hình riêng biệt. Thứ hai, tôi không thể lồng các biến nhóm - tôi không thấy vấn đề của mình ở đâu. Bất kỳ trợ giúp sử dụng nlme hoặc phương pháp khác được đánh giá rất cao. Dưới đây là mã cho ví dụ nhân tạo của tôi:

###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
)

Tham khảo: Chen, Y., Jackson, DA và Harvey, HH, 1992. So sánh các hàm von Bertalanffy và đa thức trong mô hình hóa dữ liệu tăng trưởng của cá. 49, 6: 1228-1235.

Câu trả lời:


6

X1,...,XpYf

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

ε~N(0,σ2)fBmBL1L0

Mô hình chưa phân tầng rõ ràng là mô hình con của mô hình phân tầng, do đó, kiểm tra tỷ lệ khả năng là phù hợp để xem liệu mô hình lớn hơn có đáng để thêm độ phức tạp hay không - thống kê kiểm tra là

λ= =2(L1-L0)

λχ2mp-p= =p(m-1)pχ2


Bạn có gợi ý để phù hợp với các mô hình riêng biệt, tổng hợp khả năng nhật ký từ mỗi L1 = SUM (LL_i, i từ 1 đến m) và sau đó tiến hành khả năng không? Ngoài ra, L0 có phải là một mô hình với yếu tố dự đoán phân loại trong câu hỏi được đưa vào không (ví dụ với các biến giả m-1)?
B_Miner

L0BB

Cảm ơn bạn đã đề xuất Macro. Điều này dường như là theo hướng của những gì tôi đã làm - mặc dù bạn đề nghị so sánh khả năng hơn là thử nghiệm F. Trong ví dụ của tôi, phép thử F cũng so sánh các phần dư phù hợp duy nhất với tổng các phần dư từ một số mức phù hợp áp dụng cho từng cấp độ dự đoán phân loại. Tôi đoán tôi đã tự hỏi nếu một người có thể làm điều này trong một mô hình hỗn hợp trong một bước chứ không phải phù hợp với một số mô hình. Ngoài ra, một chiến lược như vậy sẽ cho phép thử nghiệm yếu tố lồng nhau?
Marc trong hộp

Tôi không nghĩ rằng bạn sẽ có thể đi xung quanh việc lắp một số mô hình để so sánh các mô hình. Ngoài ra, có, kiểm tra tỷ lệ khả năng có thể được sử dụng để kiểm tra các yếu tố lồng nhau.
Macro

2

Tôi thấy rằng có thể mã các biến phân loại bằng nls (), chỉ bằng cách nhân các vectơ đúng / sai vào phương trình của bạn. Thí dụ:

# 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))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.