如何在R中使用公式排除主效应但保留交互作用

2023-12-23

我不想要主效应,因为它与更精细的因子固定效应共线,所以拥有这些效果很烦人NA.

在这个例子中:

lm(y ~ x * z)

我想要的互动x(数字)和z(因素),但不是主效应z.


介绍

R 文档?formula says:

“*”运算符表示因子交叉:“a * b”解释为“a + b + a : b”

因此,听起来似乎删除主要效果很简单,只需执行以下操作之一即可:

a + a:b  ## main effect on `b` is dropped
b + a:b  ## main effect on `a` is dropped
a:b      ## main effects on both `a` and `b` are dropped

哦真的吗?不不不 (太简单,太天真)。实际上,这取决于变量类别a and b.

  • 如果它们都不是因素,或者只有一个是因素,则这是真的;
  • 如果两者都是因素,那就不是。当存在交互作用(高阶效应)时,你永远不能放弃主效应(低阶效应)。

这种行为是由于一个名为的神奇函数model.matrix.default,它根据公式构造设计矩阵。数值变量只是按原样包含在列中,但因子变量会自动编码为许多虚拟列。正是这种虚拟的重新编码才具有魔力。人们普遍认为我们可以启用或禁用对比度来控制它,但事实并非如此。即使在这个最简单的例子 https://stackoverflow.com/q/38150773/4891738。问题是model.matrix.default在进行虚拟编码时有自己的规则,并且对您如何指定模型公式非常敏感。正是由于这个原因,当两个因素之间存在交互作用时,我们不能丢弃主效应。


数字和因子之间的相互作用

从你的问题来看,x是数字并且z是一个因素。您可以指定具有交互作用的模型,但不能指定具有主效应的模型z by

y ~ x + x:z

Since x是数字,相当于 do

y ~ x:z

这里唯一的区别是参数化(或者如何model.matrix.default进行虚拟编码)。考虑一个小例子:

set.seed(0)
y <- rnorm(10)
x <- rnorm(10)
z <- gl(2, 5, labels = letters[1:2])

fit1 <- lm(y ~ x + x:z)
#Coefficients:
#(Intercept)            x         x:zb  
#     0.1989      -0.1627      -0.5456  

fit2 <- lm(y ~ x:z)
#Coefficients:
#(Intercept)         x:za         x:zb  
#     0.1989      -0.1627      -0.7082 

从系数的名称我们可以看出,在第一个规范中,z进行对比,因此其第一级“a”不是虚拟编码,而在第二个规范中,z不进行对比,并且级别“a”和“b”都是虚拟编码的。鉴于这两个规范最终都有三个系数,它们实际上是等效的(从数学上讲,两种情况下的设计矩阵具有相同的列空间),您可以通过比较它们的拟合值来验证这一点:

all.equal(fit1$fitted, fit2$fitted)
# [1] TRUE

那么为什么是z与第一种情况对比?因为否则我们有两个虚拟列x:z,这两列的总和就是x,与现有模型项别名x在公式。事实上,在这种情况下即使你要求你不想要对比,model.matrix.default不会服从:

model.matrix.default(y ~ x + x:z,
      contrast.arg = list(z = contr.treatment(nlevels(z), contrasts = FALSE)))
#   (Intercept)          x       x:zb
#1            1  0.7635935  0.0000000
#2            1 -0.7990092  0.0000000
#3            1 -1.1476570  0.0000000
#4            1 -0.2894616  0.0000000
#5            1 -0.2992151  0.0000000
#6            1 -0.4115108 -0.4115108
#7            1  0.2522234  0.2522234
#8            1 -0.8919211 -0.8919211
#9            1  0.4356833  0.4356833
#10           1 -1.2375384 -1.2375384

那么为什么在第二种情况下是z不对比?因为如果是这样,我们在构建交互时就会失去“a”级的效果。即使你需要对比,model.matrix.default只会忽略你:

model.matrix.default(y ~ x:z,
      contrast.arg = list(z = contr.treatment(nlevels(z), contrasts = TRUE)))
#   (Intercept)       x:za       x:zb
#1            1  0.7635935  0.0000000
#2            1 -0.7990092  0.0000000
#3            1 -1.1476570  0.0000000
#4            1 -0.2894616  0.0000000
#5            1 -0.2992151  0.0000000
#6            1  0.0000000 -0.4115108
#7            1  0.0000000  0.2522234
#8            1  0.0000000 -0.8919211
#9            1  0.0000000  0.4356833
#10           1  0.0000000 -1.2375384

哦,太棒了model.matrix.default。它能够做出正确的决定!


两个因素之间的相互作用

让我重申一下:当存在交互时,无法消除主效应。

我不会在这里提供额外的例子,因为我在为什么我会得到 NA 系数以及如何得到lm降低交互参考电平 https://stackoverflow.com/q/40723196/4891738。请参阅那里的“交互对比”部分。简而言之,以下所有规格都给出相同的模型(它们具有相同的拟合值):

~ year:treatment
~ year:treatment + 0
~ year + year:treatment
~ treatment + year:treatment
~ year + treatment + year:treatment
~ year * treatment

特别是,第一个规范导致NA系数。

所以一旦 RHS~包含一个year:treatment,你永远不能问model.matrix.default降低主效应。

.


通过传递model.matrix.default

有些人认为model.matrix.default令人烦恼的是,它在虚拟编码中似乎没有一致的方式。他们认为“一致的方式”是始终降低第一个因素水平。嗯,没问题,可以绕过model.matrix.default通过手动进行虚拟编码,并将生成的虚拟矩阵作为变量提供给lm, etc.

然而,你仍然需要model.matrix.default帮助轻松进行虚拟编码a(是的,只有一个)因素变量。例如,对于变量z在我们前面的示例中,其完整的虚拟编码如下,您可以保留其全部或部分列进行回归。

Z <- model.matrix.default(~ z + 0)  ## no contrasts (as there is no intercept)
#   za zb
#1   1  0
#2   1  0
#3   1  0
#4   1  0
#5   1  0
#6   0  1
#7   0  1
#8   0  1
#9   0  1
#10  0  1
#attr(,"assign")
#[1] 1 1
#attr(,"contrasts")
#attr(,"contrasts")$z
#[1] "contr.treatment"

回到我们的简单示例,如果我们不想进行对比z in y ~ x + x:z, 我们可以做的

Z2 <- Z[, 1:2]  ## use "[" to remove attributes of `Z`
lm(y ~ x + x:Z2)
#Coefficients:
#(Intercept)            x       x:Z2za       x:Z2zb  
#     0.1989      -0.7082       0.5456           NA

毫不奇怪,我们看到NA(因为colSums(Z2)别名为x)。如果我们想加强对比y ~ x:z,我们可以执行以下任一操作:

Z1 <- Z[, 1]
lm(y ~ x:Z1)
#Coefficients:
#(Intercept)         x:Z1  
#    0.34728     -0.06571

Z1 <- Z[, 2]
lm(y ~ x:Z1)
#Coefficients:
#(Intercept)         x:Z1  
#     0.2318      -0.6860  

后一种情况可能就是这样对抗正在尝试做 https://stackoverflow.com/a/42028278/4891738.

然而,我真的不推荐这种黑客行为。当您将模型公式传递给lm, etc, model.matrix.default试图给您最合理的构建。此外,实际上我们希望使用拟合模型进行预测。如果您自己完成了虚拟编码,那么在提供时会遇到困难newdata to predict.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在R中使用公式排除主效应但保留交互作用 的相关文章

随机推荐

  • Azure Web 应用程序新的 X509Certificate2() 导致 System.Security.Cryptography.CryptographicException:访问被拒绝

    现在我正在上传一个 pfx 文件 输入密码并调用 var cert new X509Certificate2 fileData password 并存储指纹等内容 我不需要将其实际存储在服务器上 只需验证它是否是有效的证书并存储一些信息 在
  • Apache Beam Python 窗口和 GroupByKey

    LE TL 博士 如何在 Python 中创建无限数据源 是否可以 我正在构建一个流数据流 它将持续处理来自具有时间戳 id 和读数值的传感器的浮点值 将这些值放入FixedWindows2秒 然后输出聚合 代码链接 https gist
  • 从数组中删除每隔一个元素并重新排列键?

    我应该如何从这样的数组中删除每个第二个元素 只使用 PHP 中的内置数组函数 array array first second third fourth fifth sixth seventh 当我删除每隔一个元素时 我应该得到 array
  • Gradle wsdl 生成

    我想从 wsdl 生成 java 文件 我尝试使用wsdl2java https github com nilsmagnus wsdl2javagradle 插件 我定义插件 subprojects buildscript reposito
  • 将 KILL 与声明的变量一起使用

    我试图将 KILL 语句与声明的变量一起使用 但它给了我一个语法错误 有没有办法不使用常量并以编程方式更改 SPID 例如 DECLARE SPID smallint SET SPID 100 Kill SPID 顺便说一句 这只是一个例子
  • 设置一个元素的长度(高度或宽度)减去另一个元素的可变长度,即 calc(x - y),其中 y 未知

    我知道我们可以使用calc https developer mozilla org en US docs Web CSS calc当长度被定义时 flex basis calc 33 33 60px left calc 50 25px he
  • 虽然有复合主键,但当只有一个键唯一时 Hibernate 会报错

    我遇到了一个 Hibernate 错误 上面写着找到多于一行具有给定标识符的行我被困住了 我非常感谢对此的任何帮助 我想创建一个表订单行其中包含特定销售订单的产品代码 数量等 A 销售订单可以包含许多 orderLines orderLin
  • realloc 但只有前几个字节有意义

    假设我已经使用过ptr malloc old size 分配内存块old size字节 只有第一个header size字节是有意义的 我将把尺寸增加到new size new size大于old size and old size大于he
  • 直接连接:从大型机向 Unix 发送文件

    当我从 Mainframe Connect 直接发送可变长度文件到 UNIX 框时 UNIX 上的文件在 Mainframe 文件的开头有一些额外的字节 我尝试使用不同的 SYSOPTS 选项 但仍然收到这些初始字节 任何想法 您应该考虑将
  • Rust:从动态加载库执行特定代码行时出现段错误

    我正在用 Rust 编写一个简单的基于插件的系统 以获得使用该语言的一些技能和经验 我的系统动态加载库并在运行时执行它们以初始化每个插件 从动态加载的库执行代码时 我遇到了一个有趣的段错误问题 这是加载和运行插件初始化函数的代码 这部分工作
  • LINQ 选择第一个

    嗨 我有这段 linq 代码 var fp lnq attaches First a gt a sysid sysid name 经过分析后 它会生成以下 t sql SELECT TOP 1 t0 sysid t0 name t0 att
  • 如何压缩文件名中包含今天日期的文件夹?

    我有一个批处理和一个 vbs 文件来压缩具有特定目录名称的文件夹并将其复制到另一个文件夹 如何只压缩包含今天日期的文件夹 如果不可能 我如何才能仅压缩将今天日期作为 修改日期 列的文件夹 bat echo off set mypath C
  • admob 广告加载失败:3

    我正在开发一个 Android 应用程序 我想在我的应用程序中显示横幅广告 我以前的应用程序工作正常并且显示广告 当我创建新应用程序时 即使在旧应用程序中广告也没有显示 显示广告加载失败 ad 3 这是 logcat 中显示的内容 11 2
  • Airflow 中的 KubernetesPodOperator 特权 security_context

    我在 Google 的 Cloud Composer 上运行 Airflow 我正在使用KubernetesPodOperator https airflow apache org api airflow contrib operators
  • 当调用 dlclose 时,共享库中的全局变量会发生什么?

    如果通过 dlopen 和 dlclose 机制使用共享库 或 DLL 并且创建的共享库有一些内存来自堆的全局变量 那么当调用 dlclose 时这些变量和内存会发生什么 如果在同一个进程中 再次调用 dlopen 会出现什么行为 If d
  • 带有空 aps 字典的 iOS 推送通知

    进行研究以尝试选择通知类型的方向 我希望能够通知我的应用程序有新数据需要刷新 但不会通过弹出 通知消息打扰用户 这个想法是 如果应用程序打开或关闭 则会发出相同的通知 并且当此 特殊 消息到达并且应用程序打开时 它知道要获取数据 我的想法是
  • SharedPreferences 不适用于真实设备 FLUTTER

    我使用 SharedPreferences 来记住用户名和密码 以便下次登录时无需询问密码 当我使用带有 USB 线的真实设备进行调试时 它运行良好 但当我构建 APK 并安装它时 它在我的设备中不起作用 我不知道我错过了什么 我像这样在登
  • 页面内容是用 JavaScript 加载的,而 Jsoup 看不到它

    页面上的一个块由 JavaScript 填充内容 并且在使用 Jsoup 加载页面后 没有任何信息 有没有办法在解析页面时也获取 JavaScript 生成的内容Jsoup 无法在此处粘贴页面代码 因为它太长 http pastebin c
  • RewriteMap 在 mod-rewrite 中不起作用

    我一直在尝试使用 htaccess 中的 RewriteMap 指令进行简单映射 但由于某种原因我每次都会收到错误 500 我的语法是 选项 FollowSymLinks RewriteEngine on RewriteBase Rewri
  • 如何在R中使用公式排除主效应但保留交互作用

    我不想要主效应 因为它与更精细的因子固定效应共线 所以拥有这些效果很烦人NA 在这个例子中 lm y x z 我想要的互动x 数字 和z 因素 但不是主效应z 介绍 R 文档 formula says 运算符表示因子交叉 a b 解释为 a