如何在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中使用公式排除主效应但保留交互作用 的相关文章

  • LaTex 中与 knit 和 xtable 交叉引用的问题

    我目前正在与 R Studio 合作 使用 LaTex 中的 R knitr 生成 PDF 文档 在这些文档中 我想在文本中引用的表格中展示我的部分结果 我使用 R 中的 xtable 包生成这些表 它运行良好并为我提供了正确的表 到目前为
  • 如何提取与 R 中主题 ID 列表匹配的行?

    我有一个包含许多主题 ID 的数据框 每个主题都有重复观察 我还有一个单独的数据框 其中只有一个主题 ID 列表 我想从更大的数据框中匹配和提取 如何以允许我引用不同数据帧中的SubjectID列表的方式编写代码 不确定我是否完全理解这个问
  • 如何在R中计算文本中的句子数?

    我使用 R 将文本读入readChar 功能 我的目的是测试文本句子中字母 a 出现次数与字母 b 出现次数一样多的假设 我最近发现了 stringr 包 它帮助我对文本做很多有用的事情 例如计算字符数以及整个文本中每个字母出现的总数 现在
  • ggplot2可以在一个图例中分别控制点大小和线大小(线宽)吗?

    一个使用的例子ggplot2绘制数据点组和连接每组均值的线 并使用相同的映射aes for shape并为linetype p lt ggplot mtcars aes gear mpg shape factor cyl linetype
  • 如何在 ggplot 中保持配色方案,同时删除每个图中未使用的级别?

    我想比较一个图中的数据的一些子组和另一图中的一些其他子组 如果我绘制一个图 其中绘制了所有子组 那么这个数字将是巨大的 并且每个单独的比较都会变得困难 我认为如果给定的子组在所有图中都具有相同的颜色 这对读者来说会更有意义 这是我尝试过的两
  • LDA with topicmodels,如何查看不同文档属于哪些主题?

    我正在使用 topicmodels 包中的 LDA 我已经在大约 30 000 个文档上运行它 获取了 30 个主题 并获得了主题的前 10 个单词 它们看起来非常好 但我想看看哪些文档属于哪个主题的概率最高 我该怎么做 myCorpus
  • 如何从 Fortran 调用 R 函数?

    根据http gallery rcpp org articles r function from c http gallery rcpp org articles r function from c Rcpp 允许用户从 C 调用 R 函数
  • 重复测量引导统计数据,按多个因素分组

    我有一个看起来像这样的数据框 但显然还有更多行等 df lt data frame id c 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 cond c A A B B A A B B A A B B A A B B co
  • 选择 R 中的数据表中隐藏时(在绿色加号下方)列的显示顺序

    Context 使用 DataTables 库制作交互式表格时 当屏幕宽度对于列的数量和宽度来说太窄时 列将隐藏在绿色 号下 我有一个非常宽的表格 有 20 多列 其中一些内容非常冗长 因此某些列在所有屏幕宽度下总是隐藏的 每次隐藏新列时
  • 通过间接引用列来修改数据框中的某些值

    我正在整理一些数据 我们将失败的数据分类到垃圾箱中 并按批次计算每个分类箱的有限产量 我有一个描述排序箱的元表 这些行按升序测试顺序排列 一些排序标签带有非语法名称 sort tbl lt tibble tribble weight lab
  • 将数据框中的每个 x 个字符拆分为字符串

    我知道这里有一些关于每隔一段时间分割一个字符串的答案nth字符 例如this one https stackoverflow com questions 23208490 split each character in r and this
  • Dendextend:关于如何根据定义的组为树状图的标签着色

    我正在尝试使用一个名为 dendextend 的很棒的 R 包来绘制树状图并根据一组先前定义的组为其分支和标签着色 我已阅读您在 Stack Overflow 中的答案以及 dendextend vignette 的常见问题解答 但我仍然不
  • 尝试读取 CSV 文件时出现“无法识别的字符串转义”

    我正在尝试导入一个 csv文件 以便我可以观看此视频 R ggplot2 图形直方图 http www youtube com watch v 47kWynt3b6M 我安装了所有正确的软件包 包括ggplot以及相关的包 视频中的第一个说
  • 在 R 中绘制 Likert 变量的堆积条形图

    假设我有一个如下所示的数据框 P Q1 Q2 1 1 4 1 2 2 3 4 3 1 1 4 其中的列告诉我哪个人相应地回答了问题 q1 q2 中的哪一个 这些问题需要按照 4 分李克特量表进行回答 例如 批准 表示 1 稍微批准 表示 2
  • R 中的列乘以子字符串

    假设我有一个数据框 其中包含多个组件及其在多个列中列出的属性 并且我想对这些列运行多个函数 我的方法是尝试将其基于每个列标题中的子字符串 但我无法弄清楚如何做到这一点 下面是数据框的示例 Basket F Type 1 F Qty 1 F
  • 使用 Shiny 发布平行坐标图表时出现“错误:路径[1]="”:没有这样的文件或目录”

    我有一个似乎很常见但我还没有找到解决方案的问题 当尝试使用 rCharts Parcoords 发布 Web 应用程序时 出现以下错误 错误 路径 1 没有这样的文件或目录 奇怪的是 该应用程序在我的笔记本电脑上运行得很好 下面是我正在使用
  • 基于时间窗口的不规则时间序列的优化滚动函数

    有没有办法使用 rollapply 来自zoo包或类似的东西 优化功能 rollmean rollmedian等 使用基于时间的窗口计算滚动函数 而不是基于大量观察的函数 我想要的很简单 对于不规则时间序列中的每个元素 我想计算一个具有 N
  • 在 r 中的 group_by 之后建模后取消列表列的嵌套

    我想对所有组进行线性回归group by 将模型系数保存在列表列中 然后使用 unnest 扩展列表列 这里我用的是mtcars以数据集为例 注 我想用do here becausebroom tidy 不适用于所有型号 mtcars gt
  • 相当于 min() 的 rowMeans()

    我在 R 邮件列表上多次看到这个问题 但仍然找不到满意的答案 假设我有一个矩阵m m lt matrix rnorm 10000000 ncol 10 我可以通过以下方式获得每行的平均值 system time rowMeans m use
  • 旋转 Markdown 的表格 pdf 输出

    我想将 pdf 上的表格输出旋转 90 度 我正在使用 Markdown 生成报告并kable循环显示表格 如果可以的话我想继续使用kable因为还有很多其他依赖于它的东西我没有包含在这个 MWE 中 这是一个简单的例子 使用iris数据集

随机推荐

  • 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