用R中的随机效应估计折断的棒/分段线性模型中的断点[包括代码和输出]


14

当我还需要估计其他随机效应时,有人可以告诉我如何让R估计分段线性模型中的断裂点(作为固定或随机参数)吗?

我在下面提供了一个玩具示例,该示例适合曲棍球杆/折断的杆回归,其随机点的斜率变化和y轴截距的随机变化为4的断裂点。我想估算断裂点而不是指定断裂点。它可以是随机效果(最好)或固定效果。

library(lme4)
str(sleepstudy)

#Basis functions
bp = 4
b1 <- function(x, bp) ifelse(x < bp, bp - x, 0)
b2 <- function(x, bp) ifelse(x < bp, 0, x - bp)

#Mixed effects model with break point = 4
(mod <- lmer(Reaction ~ b1(Days, bp) + b2(Days, bp) + (b1(Days, bp) + b2(Days, bp) | Subject), data = sleepstudy))

#Plot with break point = 4
xyplot(
        Reaction ~ Days | Subject, sleepstudy, aspect = "xy",
        layout = c(6,3), type = c("g", "p", "r"),
        xlab = "Days of sleep deprivation",
        ylab = "Average reaction time (ms)",
        panel = function(x,y) {
        panel.points(x,y)
        panel.lmline(x,y)
        pred <- predict(lm(y ~ b1(x, bp) + b2(x, bp)), newdata = data.frame(x = 0:9))
            panel.lines(0:9, pred, lwd=1, lty=2, col="red")
        }
    )

输出:

Linear mixed model fit by REML 
Formula: Reaction ~ b1(Days, bp) + b2(Days, bp) + (b1(Days, bp) + b2(Days, bp) | Subject) 
   Data: sleepstudy 
  AIC  BIC logLik deviance REMLdev
 1751 1783 -865.6     1744    1731
Random effects:
 Groups   Name         Variance Std.Dev. Corr          
 Subject  (Intercept)  1709.489 41.3460                
          b1(Days, bp)   90.238  9.4994  -0.797        
          b2(Days, bp)   59.348  7.7038   0.118 -0.008 
 Residual               563.030 23.7283                
Number of obs: 180, groups: Subject, 18

Fixed effects:
             Estimate Std. Error t value
(Intercept)   289.725     10.350  27.994
b1(Days, bp)   -8.781      2.721  -3.227
b2(Days, bp)   11.710      2.184   5.362

Correlation of Fixed Effects:
            (Intr) b1(D,b
b1(Days,bp) -0.761       
b2(Days,bp) -0.054  0.181

折断的棒回归适合每个人


1
有什么办法使bp产生随机效应?
djhocking

Answers:


20

另一种方法是将对lmer的调用包装在传递给断点作为参数的函数中,然后使用optimize最小化以断点为条件的拟合模型的偏差。这样可以最大程度地提高断点的配置文件对数似然性,并且通常(即,不仅仅针对此问题)如果包装器内部的函数(在这种情况下为lmer)发现最大似然估计取决于传递给它的参数,该过程找到所有参数的联合最大似然估计。

library(lme4)
str(sleepstudy)

#Basis functions
bp = 4
b1 <- function(x, bp) ifelse(x < bp, bp - x, 0)
b2 <- function(x, bp) ifelse(x < bp, 0, x - bp)

#Wrapper for Mixed effects model with variable break point
foo <- function(bp)
{
  mod <- lmer(Reaction ~ b1(Days, bp) + b2(Days, bp) + (b1(Days, bp) + b2(Days, bp) | Subject), data = sleepstudy)
  deviance(mod)
}

search.range <- c(min(sleepstudy$Days)+0.5,max(sleepstudy$Days)-0.5)
foo.opt <- optimize(foo, interval = search.range)
bp <- foo.opt$minimum
bp
[1] 6.071932
mod <- lmer(Reaction ~ b1(Days, bp) + b2(Days, bp) + (b1(Days, bp) + b2(Days, bp) | Subject), data = sleepstudy)

要获得断点的置信区间,可以使用轮廓似然。添加例如qchisq(0.95,1)最小偏差(对于95%置信区间),然后搜索foo(x)等于计算值的点:

foo.root <- function(bp, tgt)
{
  foo(bp) - tgt
}
tgt <- foo.opt$objective + qchisq(0.95,1)
lb95 <- uniroot(foo.root, lower=search.range[1], upper=bp, tgt=tgt)
ub95 <- uniroot(foo.root, lower=bp, upper=search.range[2], tgt=tgt)
lb95$root
[1] 5.754051
ub95$root
[1] 6.923529

此玩具问题有些不对称,但精度不差。如果您有足够的数据可以使引导程序可靠,则另一种方法是引导估计程序。


谢谢您-很有帮助。该技术是称为两阶段估算程序,还是具有我可以参考/查找的标准名称?
锁定2011年

这是最大可能性,或者如果lmer使可能性最大(我认为默认值实际上是REML,则需要将参数REML = FALSE传递给lmer以获得ML估计值)。只是以嵌套方式估算,而不是一次估算。我在答案的前面添加了一些说明。
jbowman 2011年

在用真实数据反转概貌似然性时,我遇到了一些优化问题和较宽的配置项,但在我的实现中使用了较窄的引导配置项。您是否正在构想一个非参数的引导程序,并用采样替换受试者的数据向量?即,对于睡眠研究数据,这将需要从10个数据点的18个(对象)向量中进行替换采样,而无需在受试者的数据向量内进行任何重新采样。
锁定2011年

是的,正如您所描述的,我正在构想一个非参数的引导程序,但是部分原因是因为我对可能适用(或可能不适用)的高级引导程序技术知之甚少。基于轮廓似然的配置项和自举都渐近准确,但是很可能自举对于您的样本而言明显更好。
jbowman 2011年

5

jbowman提出的解决方案非常好,只需添加一些理论说明即可:

  • 考虑到所使用的指标函数的不连续性,轮廓似然性可能非常不稳定,具有多个局部最小值,因此常规优化器可能无法正常工作。对于此类“阈值模型”,通常的解决方案是使用更麻烦的网格搜索,在每个可能的实现的断点/阈值天(而不是如代码中所述的中间值)处评估偏差。请参阅底部的代码。

  • 在这个估计断点的非标准模型中,偏差通常不具有标准分布。通常使用更复杂的过程。请参阅下面对Hansen(2000)的参考。

  • 引导程序在这方面并不总是一致的,请参见下面的Yu(即将发表)。

  • 最后,对我来说还不清楚为什么您要通过围绕Days重新定位中心来转换数据(即bp-x而不是x)。我看到两个问题:

    1. 通过此过程,您可以创建人工日,例如6.1天,4.1等。我不确定如何解释6.07的结果,因为您仅观察到了第6天和第7天的值?(在标准断点模型中,阈值在6到7之间的任何值都应具有相同的系数/偏差)
    2. b1和b2具有相反的含义,因为b1的天数减少了,而b2的天数增加了?所以没有断点的非正式测试是b1!=-b2

对此的标准参考是:

  • 标准OLS:Hansen(2000)样本拆分和阈值估计,计量经济学,卷。68,第3号。(2000年5月),第575-603页。
  • 更多外来模型:Lee,Seo,Shin(2011)回归模型中阈值效应的测试,美国统计协会杂志(理论与方法)(2011),106,220-231
  • 于平(即将出版)阈值回归中的引导”,计量经济学理论。

码:

# Using grid search over existing values:
search.grid <- sort(unique(subset(sleepstudy, Days > search.range[1] &
Days<search.range[2], "Days", drop=TRUE)))

res <- unlist(lapply(as.list(search.grid), foo))

plot(search.grid, res, type="l")
bp_grid <- search.grid[which.min(res)]

0

您可以尝试MARS模型。但是,我不确定如何指定随机效果。 earth(Reaction~Days+Subject, sleepstudy)


1
谢谢-我浏览了软件包文档,但它似乎不支持随机效果。
锁定2011年

0

是一篇提出混合效应MARS的论文。正如@lockedoff提到的,我在任何包中都看不到相同的任何实现。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.