Özel model formülasyonu ve eğimi için bir işlev oluşturarak böyle bir şey yapmanın mümkün olduğuna inanıyorum. Standart SSlogis fonksiyonu aşağıdaki biçimde bir lojistik fonksiyonunu kullanır:
# Just for loading the data, we will use lme4 for model fitting, not nlme
library(nlme)
library(lme4)
# Careful when loading both nlme and lme4 as they have overlap, strange behaviour may occur
# A more generalized form could be taken e.g. from http://en.wikipedia.org/wiki/Generalised_logistic_curve
# A custom model structure:
Model <- function(age, Asym, Asym2, xmid, scal, Gender)
{
# Taken from ?SSlogis, standard form:
#Asym/(1+exp((xmid-input)/scal))
# Add gender-specific term to Asym2
(Asym+Asym2*Gender)/(1+exp((xmid-age)/scal))
# Evaluation of above form is returned by this function
}
# Model gradient, notice that we include all
# estimated fixed effects like 'Asym', 'Asym2', 'xmid' and 'scal' here,
# but not covariates from the data: 'age' and 'Gender'
ModelGradient <- deriv(
body(Model)[[2]],
namevec = c("Asym", "Asym2", "xmid", "scal"),
function.arg=Model
)
cinsiyet etkisinin tanıtılması Oldukça tipik yolu ikili kodlama olduğunu.
# Binary coding for the gender
Orthodont2 <- data.frame(Orthodont, Gender = as.numeric(Orthodont[,"Sex"])-1)
#> table(Orthodont2[,"Gender"])
# 0 1
#64 44
# Ordering data based on factor levels so they don't mix up paneling in lattice later on
Orthodont2 <- Orthodont2[order(Orthodont2[,"Subject"]),]
Sonra özelleştirilmiş modeli sığabilecek: Ben Cinsiyet kodlu bir ikili -Değişken Seks dönüştürecek
# Fit the non-linear mixed effects model
fit <- nlmer(
# Response
distance ~
# Fixed effects
ModelGradient(age = age, Asym, Asym2, xmid, scal, Gender = Gender) ~
# replaces: SSlogis(age,Asym, xmid, scal) ~
# Random effects
(Asym | Subject) + (xmid | Subject),
# Data
data = Orthodont2,
start = c(Asym = 25, Asym2 = 15, xmid = 11, scal = 3))
Ne olur ki zaman Cinsiyet == 0 (Erkek), model değerlere ulaşır: h aslında standart SSlogis-fonksiyonu formudur. Ancak, ikili anahtarı şimdi olduğu takdirde Cinsiyet == 1 (Kadın):
(Asym+Asym2)/(1+exp((xmid-age)/scal))
yüzden yaş arttıkça elde asimptotik seviyesi aslında Asım + Asym2 değil, sadece Asım olduğuna Kadın bireyler için. Ayrıca, Asym2 için yeni bir rasgele efekt belirtmediğime dikkat edin. Asym, cinsiyete özgü olmadığı için, kadın bireyler bireylerinde Asym -term'den dolayı asimptotik düzeylerde varyansa sahip olabilirler. Model uyum: - 3,493 = 29.882:
> summary(fit)
Nonlinear mixed model fit by the Laplace approximation
Formula: distance ~ ModelGradient(age = age, Asym, Asym2, xmid, scal, Gender = Gender) ~ (Asym | Subject) + (xmid | Subject)
Data: Orthodont2
AIC BIC logLik deviance
268.7 287.5 -127.4 254.7
Random effects:
Groups Name Variance Std.Dev.
Subject Asym 7.0499 2.6552
Subject xmid 4.4285 2.1044
Residual 1.5354 1.2391
Number of obs: 108, groups: Subject, 27
Fixed effects:
Estimate Std. Error t value
Asym 29.882 1.947 15.350
Asym2 -3.493 1.222 -2.859
xmid 1.240 1.068 1.161
scal 5.532 1.782 3.104
Correlation of Fixed Effects:
Asym Asym2 xmid
Asym2 -0.471
xmid -0.584 0.167
scal 0.901 -0.239 -0.773
kadın hastalar 'yaş' arttıkça 'mesafeye' biraz daha düşük değerlere ulaşır görünüyor ki, bir cinsiyete özgü bir etkiye (t -2,859) olabilir gibi görünüyor 26.389
Sadece bunun iyi bir/en iyi model olduğunu aklınızdan çıkarmayacağım, sadece lme4 numaralı lineer olmayan modelleri özelleştirerek nasıl devam edebileceğinizi gösteriyorum.
# Extracting fixed effects components by calling the model function, a bit messy but it works
# I like to do this for visualizing the model fit
fixefmat <- matrix(rep(fixef(fit), times=dim(Orthodont2)[1]), ncol=length(fixef(fit)), byrow=TRUE)
colnames(fixefmat) <- names(fixef(fit))
Orthtemp <- data.frame(fixefmat, Orthodont2)
attach(Orthtemp)
# see str(Orthtemp)
# Evaluate the function for rows of the attached data.frame to extract fixed effects corresponding to observations
fix = as.vector(as.formula(body(Model)[[2]]))
detach(Orthtemp)
nobs <- 4 # 4 observations per subject
legend = list(text=list(c("y", "Xb + Zu", "Xb")), lines = list(col=c("blue", "red", "black"), pch=c(1,1,1), lwd=c(1,1,1), type=c("b","b","b")))
require(lattice)
xyplot(
distance ~ age | Subject,
data = Orthodont2,
panel = function(x, y, ...){
panel.points(x, y, type='b', col='blue')
panel.points(x, fix[(1+nobs*(panel.number()-1)):(nobs*(panel.number()))], type='b', col='black')
panel.points(x, fitted(fit)[(1+nobs*(panel.number()-1)):(nobs*(panel.number()))], type='b', col='red')
},
key = legend
)
# Residuals
plot(Orthodont2[,"distance"], resid(fit), xlab="y", ylab="e")
# Distribution of random effects
par(mfrow=c(1,2))
hist(ranef(fit)[[1]][,1], xlab="Random 'Asym'", main="")
hist(ranef(fit)[[1]][,2], xlab="Random 'xmid'", main="")
# Random 'xmid' seems a bit skewed to the right and may violate normal distribution assumption
# This is due to M13 having a bit abnormal growth curve (random effects):
# Asym xmid
#M13 3.07301310 3.9077583
Grafik çıkışı:
sen (How do I extract lmer fixed effects by observation? doğrusal modeller için görselleştirme benzer şekilde) doğrusal olmayan sabit etkilerini ayıklamak istiyorsanız model için Görselleştirmeler müdahalesi biraz gerektirir Yukarıdaki resimde, Dişi (F ##) bireylerin, Erkek (M ##) muadillerinden (siyah çizgiler) biraz daha düşük olduğuna dikkat edin. Örneğin. M10 < -> Orta alan panellerinde F10 farkı.
artığı ve belirtilen model bazı özelliklerini incelemek için rastgele bir etki. Bireysel M13 biraz zor görünüyor.
Evet, ancak bu kolay değil. http://rpubs.com/bbolker/3423, http://stackoverflow.com/questions/11056625/how-to-add-fixed-effect-to-four-parameter-logistic-model-in-nlmer. Olması gerekiyor ?? nlme'de daha kolay ol. –
Bağlantı için teşekkürler, bunun kolay olmadığından şaka yapmıyorsunuzdur. Pinhiero ve Bates kitabında "S ve S-Plus'daki Karışık Efekt Modelleri" nlme kullanan, hem sabit etki grubu hem de rastgele etki özneleri örneği olan doğrusal olmayan örnekler bulamadım. – iantist
Örneğini çalıştırmaya çalışırken bir hata alıyorum: 'fn (nM $ xeval()) 'da hata: prss 300 iterasyonda yakınsama başarısız oldu – jsta