Вы можете использовать нормальные тесты отношения правдоподобия. Вот простой пример. Во-первых, давайте создадим наблюдения от 10 человек на основе ваших параметров:
Asym = .6
xmid = 23
scal = 5
n = 10
time = seq(1,60,5)
d = data.frame(time=rep(time,10),
Asym, xmid, scal, group=0)
d$subj = factor(rep(1:n, each=length(time)))
Теперь пусть половина из них имеет разные асимптоты и параметры средней точки:
ind = (nrow(d)/2):nrow(d)
d$Asym[ind] = d$Asym[ind] + .1
d$xmid[ind] = d$xmid[ind] + 10
d$group[ind] = 1
d$group=factor(d$group)
Мы можем смоделировать значения ответов для всех людей на основе модели:
set.seed(1)
d = transform(d, y = Asym/(1+exp((xmid-time)/scal)) +
rnorm(nrow(d), sd=.04))
library(lattice)
xyplot(y~time | group, group=subj,
data=d, type=c("g","l"), col="black")
Мы можем видеть четкие различия между двумя группами, различия, которые модели должны быть в состоянии уловить. Теперь давайте сначала попробуем подобрать простую модель, игнорируя группы:
> fm1 = nls(y ~ SSlogis(time, Asym, xmid, scal), data=d)
> coef(fm1)
Asym xmid scal
0.6633042 28.5219166 5.8286082
Возможно, как и ожидалось, оценки Asym
и xmid
находятся где-то между реальными значениями параметров для двух групп. (То, что это имело бы место, не очевидно, хотя, поскольку параметр масштаба также изменен, чтобы приспособиться к неправильной спецификации модели.) Теперь давайте подберем полную модель с различными параметрами для двух групп:
> fm2 = nls(y ~ SSlogis(time, Asym[group], xmid[group], scal[group]),
data=d,
start=list(Asym=rep(.6,2), xmid=rep(23,2), scal=rep(5,2)))
> coef(fm2)
Asym1 Asym2 xmid1 xmid2 scal1 scal2
0.602768 0.714199 22.769315 33.331976 4.629332 4.749555
Поскольку две модели являются вложенными, мы можем выполнить тест отношения правдоподобия:
> anova(fm1, fm2)
Analysis of Variance Table
Model 1: y ~ SSlogis(time, Asym, xmid, scal)
Model 2: y ~ SSlogis(time, Asym[group], xmid[group], scal[group])
Res.Df Res.Sum Sq Df Sum Sq F value Pr(>F)
1 117 0.70968
2 114 0.13934 3 0.57034 155.54 < 2.2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Чрезвычайно малое значение p ясно показывает, что простая модель была слишком простой; две группы действительно отличаются по своим параметрам.
Однако две оценки параметров шкалы практически идентичны, с разницей всего в 0,1. Возможно, нам нужен только один масштабный параметр? (Конечно, мы знаем, что ответ - да, так как мы смоделировали данные.)
(Разница между двумя параметрами асимптоты также составляет всего 0,1, но это большая разница, когда мы учитываем стандартные ошибки - см summary(fm2)
.)
Итак, мы подходим к новой модели, с общими scale
параметрами для двух групп, но разными Asym
и xmid
параметрами, как и раньше:
> fm3 = nls(y ~ SSlogis(time, Asym[group], xmid[group], scal),
data=d,
start=list(Asym=rep(.6,2), xmid=rep(23,2), scal=5))
> coef(fm3)
Asym1 Asym2 xmid1 xmid2 scal
0.6035251 0.7129002 22.7821155 33.3080264 4.6928316
А поскольку уменьшенная модель вложена в полную модель, мы снова можем выполнить тест отношения правдоподобия:
> anova(fm3, fm2)
Analysis of Variance Table
Model 1: y ~ SSlogis(time, Asym[group], xmid[group], scal)
Model 2: y ~ SSlogis(time, Asym[group], xmid[group], scal[group])
Res.Df Res.Sum Sq Df Sum Sq F value Pr(>F)
1 115 0.13945
2 114 0.13934 1 0.00010637 0.087 0.7685
Большое значение p указывает, что уменьшенная модель подходит так же, как и полная модель, как и ожидалось.
Конечно, мы можем сделать аналогичные тесты, чтобы проверить, нужны ли разные значения параметров для just Asym
, just xmid
или обоих. Тем не менее, я бы не рекомендовал делать пошаговую регрессию таким образом, чтобы исключить параметры. Вместо этого просто протестируйте полную модель ( fm2
) с простой моделью ( fm1
), и будьте довольны результатами. Для количественной оценки любых различий, графики будут полезны.