交互项中的非线性效应

机器算法验证 回归 数据可视化 相互作用 非线性 回归策略
2022-03-14 21:14:44

如果您有B,这是一个0/1结果变量,S,这是一个连续变量,并且T,这是一个治疗虚拟变量,您如何使用回归结果和图表来显示假设的非线性效应?

例如,我假设治疗对S​​'s 分布中间的人最重要。

我一直在运行的回归是B = S + T + ST.

任何关于该主题的引用也将不胜感激。

4个回答

下面使用 Rrms包使用普通最小二乘建模,并在默认节点位置使用 4 个节点的受限三次样条平滑地建模非线性效应。这将为每个治疗组总共 3 个参数生成一个线性分量和 2 个非线性分量。

require(rms)
dd <- datadist(mydata); options(datadist='dd')  # facilitates plotting
f <- ols(B ~ rcs(S, 4) * T, data=mydata)
anova(f)    # tests for interaction (shape differences across T, 3 d.f.)
            # anova includes a test for nonlinear interaction
            # also provides a global test for T, 4 d.f.
plot(Predict(f, S, T))   # shows 2 estimated curves for 2 values of T
ggplot(Predict(f, S, T))  # will be in next release; uses ggplot2

这些图包括 0.95 个逐点置信带。可以选择使用同时置信带。

因为我在其他地方看到了“ols”,所以我忽略了响应变量是分类的。要拟合逻辑回归模型而不是 ols 模型,请替换lrm( )ols( ). 不需要其他代码更改。您可以使用summary(f, ...)获取 T 或 S 的优势比。默认情况下,S 的优势比将是 S 在 T 的参考(最频繁)水平上的四分位间距效应。

这正是几年前我从 Stata 切换到 R 和 Frank 的 rms 包(当时称为 Design)的原因。

无论如何,这个有点hack-ish的代码至少会让你开始。语法有点过时,可能有更好的方法来编码(有一段时间没有使用Stata),但它就在这里

编辑:在我早上喝咖啡后重新写...

*** use automobile data
sysuse auto 

*** create restricted cubic spline basis functions for mpg, with four knots
mkspline mpgsp = mpg, cubic nknots(4) 

*** create the interactions
gen formpg1=foreign*mpgsp1
gen formpg2=foreign*mpgsp2
gen formpg3=foreign*mpgsp3

*** Regressing price on foreign and mpg allowing for non-linear interactions
xi: reg price i.foreign mpgsp* formpg* 

测试总交互

test formpg1 formpg2 formpg3 

省略任何非线性交互项测试的第一项,例如

test formpg2 formpg3

要获得 的全局 4 df 测试T,在这个例子中是外来的,弗兰克在上面的例子中提到

test _Iforeign_1 formpg1 formpg2 formpg3

只需更改reglogit逻辑回归即可。要绘制结果,您需要形成线性预测器,例如使用predictnl,我从来没有设法做对。

有关一些想法,请参阅 Patrick Royston 最近在http://www.stata.com/meeting/germany12/abstracts/desug12_royston.pdf上的演讲。

希望这可以帮助。

您是否考虑过使用广义加法模型? 维基百科链接在这里

基本上模型是

g(y)=Xβ+jfj(Zj)+ϵ

或在您的特定情况下

B=logit(f(S,T))
在 R 中,您可以使用该mgcv包,并运行类似

library(mgcv)
m = gam(B~te(S,T),family=binomial)

这将为您提供两个变量的非参数交互。如果您想从交互效果中分离出主要效果,您可以等效地拟合

m = gam(B~ti(S)+ti(T)+ti(S,T),family=binomial)

plot(m,pages=1, scheme=2)然后,您可以通过(我更喜欢等高线图,我自己)查看估计交互的等高线图,或者您可以使用该vis.gam函数查看预测值。

或者,如果您的治疗T是二元的,您可能适合

m = gam(B~s(S,by=as.factor(T)),family=binomial)

所有这一切的教科书都是与 R 包一起制作的,这里Simon Wood 的。

您还需要检查?te,?ti等。

您可以通过证明非线性模型更适合来争论非线性效应。例如,您可以实施分段线性模型以考虑 S 影响的变化。根据您的假设,您还可以线性化您的因素。例如,因子的对数变换可能会减少残差。这可以用来论证因子和响应之间的关系不是线性的,因为转换后的变量拟合得更好。我希望这会有所帮助。