비선형 모델로 그룹화 변수의 효과를 테스트하는 방법은 무엇입니까?


15

비선형 모델에서 그룹화 변수 사용에 관한 질문이 있습니다. nls () 함수는 요인 변수를 허용하지 않기 때문에 모형 적합에 대한 요인의 영향을 테스트 할 수 있는지 알아 내기 위해 고심하고 있습니다. 아래에는 "계절 화 된 폰 베르 탈란 피"성장 모델을 다양한 성장 처리 (가장 일반적으로 어류 성장에 적용)에 맞추려는 예가 포함되어 있습니다. 나는 물고기가 자란 호수와 주어진 음식 (인공적인 예)뿐만 아니라 호수의 효과를 테스트하고 싶습니다. 이 문제의 해결 방법에 익숙합니다. Chen et al.에 의해 요약 된 것처럼 풀링 된 데이터와 개별 피팅에 맞는 F- 검정 비교 모델을 적용합니다. (1992) (ARSS- "잔차 제곱합 분석"). 즉, 아래 예에서는

여기에 이미지 설명을 입력하십시오

nlme ()를 사용하여 R 에서이 작업을 수행하는 더 간단한 방법이 있다고 생각하지만 문제가 발생합니다. 우선, 그룹화 변수를 사용하면 자유도가 개별 모델을 피팅하여 얻는 것보다 높습니다. 둘째, 그룹화 변수를 중첩 할 수 없습니다-문제가 어디에 있는지 알 수 없습니다. nlme 또는 다른 방법을 사용하는 데 도움을 주시면 감사하겠습니다. 아래는 인공 예제의 코드입니다.

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

참조 : Chen, Y., Jackson, DA and Harvey, HH, 1992. 어류 성장 데이터를 모델링 할 때 von Bertalanffy와 다항 함수의 비교. 49, 6 : 1228-1235.

답변:


6

엑스1,...,엑스와이에프

와이=에프(엑스1,...,엑스)+ε

ε(0,σ2)에프미디엄10

계층화되지 않은 모델은 명확하게 계층화 된 모델의 하위 모델이므로 큰 모델이 복잡성을 더할만한 가치가 있는지 여부를 확인 하기 위해 우도 비율 검정 이 적합합니다.

λ=2(10)

λχ2미디엄=(미디엄1)χ2


m 개의 개별 모형을 적합시키고 각 L1 = SUM (LL_i, i에서 1에서 m까지)의 로그 우도를 합한 다음 우도를 진행하겠습니까? 또한 L0은 문제의 예측 변수가 포함 된 모델입니까 (예 : m-1 더미 변수 포함)?
B_Miner

0

당신의 제안 매크로에 감사드립니다. F- 검정보다는 가능성에 대한 비교를 제안하지만 이것은 이미 이미 한 방향으로 보입니다. 나의 예에서, F- 검정은 또한 단일 적합 잔차를 각 범주 형 예측 변수 수준에 적용된 여러 적합치의 잔차의 합과 비교합니다. 여러 모델을 맞추기보다는 한 단계로 혼합 모델 내 에서이 작업을 수행 할 수 있는지 궁금합니다. 또한 그러한 전략으로 중첩 인자 테스트가 가능합니까?
Marc in the box

모델을 비교하기 위해 여러 모델을 피팅 할 수 있다고 생각하지 않습니다. 또한 가능성 비율 검정을 사용하여 내포 요인을 검정 할 수 있습니다.
매크로

2

단순히 참 / 거짓 벡터를 방정식에 곱함으로써 범주 변수를 nls ()로 코딩하는 것이 가능하다는 것을 알았습니다. 예:

# 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))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.