在回归中仅与一个因子水平交互的R语言操作

10
在回归模型中,是否可以仅使用一个因子的虚拟变量与交互作用?例如,假设我有以下数据:
x: numerical vector of 3 variables (1,2 and 3)
y: response variable
z: numerical vector

有没有可能构建像这样的模型:

y ~ factor(x) + factor(x) : z

但仅包括与一个级别的X交互?我意识到我可以为每个x级别创建单独的虚拟变量,但如果可能的话,我想简化事情。

非常感谢任何意见!


1
为什么你想要这样做?这一开始看起来毫无意义。 - gung - Reinstate Monica
1
也许这没什么意义。我还在学习阶段,但是似乎无论在哪里都找不到解决我眼前问题的答案。更明确地说,我有一个考克斯比例风险模型,我怀疑只有一个分类变量与时间相互作用。如果我将其作为虚拟变量包含进去,那么会使survfit函数变得复杂,因为“newdata”必须包括虚拟变量。 - user2081788
为什么不稍微调整一下数据,创建一个新的数据框,只包含所需的交互作用呢? - Ricardo Saporta
更多的是关于简单性的问题。我的理解是,R会将因子中的每个类别作为虚拟变量对响应变量进行回归 - 因此会为每个类别估计系数。肯定有一些简单的方法可以告诉R只对因子中的一个虚拟变量与响应变量进行回归? - user2081788
2
可能只有1组(3组中的1组)会随时间变化,但是将所有3个因素包括在交互作用中并不会损失太多。其中一个因素将被保留为参考组,其他因素将与其进行比较。您需要使用2个自由度来估计交互作用,如果按照您想要的方式进行,则只需使用1个自由度。也就是说,您只能节省1个df;即使这样做有意义,也几乎不值得麻烦。 - gung - Reinstate Monica
1
没错!绝对是这样。不幸的是,我的情况现在是独特的,因为当测试所有三个交互作用时,我遇到了这个问题,就像这里某人所概述的那样:https://stat.ethz.ch/pipermail/r-help/2008-September/174201.html
  • 模型无法收敛。然而,如果我按照长方式进行操作,并且只包括1个交互作用 - 我发现它会很好地收敛。现在我想清理我的语法,并使其更容易进行进一步的调查。
- user2081788
4个回答

6
你所忽略的一个关键点是,当你看到像x2:z这样的显著效应时,并不意味着当x == 2xz相互作用,而是意味着x == 2x == 1之间的差异(或者你的参考水平)与z相互作用。它不是x的一个级别与z相互作用,而是为x设置的对比之一与z相互作用。
因此,对于一个默认处理对比的三级因素:
df <- data.frame(x = sample(1:3, 10, TRUE), y = rnorm(10), z = rnorm(10))
df$x <- factor(df$x)
contrasts(df$x)
  2 3
1 0 0
2 1 0
3 0 1

如果你真的认为只有第一个对比很重要,你可以创建一个新变量来比较x == 2x == 1,并忽略x == 3

df$x_1vs2 <- NA
df$x_1vs2[df$x == 1] <- 0
df$x_1vs2[df$x == 2] <- 1
df$x_1vs2[df$x == 3] <- NA

然后使用它运行回归测试:

lm(y ~ x_1vs2 + x_1vs2:z)

谢谢!那解释了很多问题! - user2081788

2
如果你的数据中已经将 x 编码为因子,那么类似以下代码:
y ~ x + I(x=='some_level'):z

或者如果您的数据框中的x是数字类型,则

y ~ as.factor(x) + I(as.factor(x)=='some_level'):z

或者只对数据的某个子集进行建模,尝试:

lm(y ~ as.factor(x) + as.factor(x):z, data = subset(df, x=='some_level'))

1
这个解决方案似乎有与Matthew Lundberg的相同问题。 - user2081788
如果您只想分析包括x=='some_level'的数据子集,则需要对数据进行子集化处理...已添加到我上面的答案中。 - Gary Weissman
1
谢谢!我很感激你的帮助。不幸的是,我并不只是尝试对一个子集进行建模。请查看主问题下的评论以获取更多详细信息。 - user2081788

0
X <- data.frame(x = sample(1:3, 10, TRUE), y = rnorm(10), z = rnorm(10))
lm(y ~ factor(x) + factor(x):z, data=X)

这是你想要的吗?


在这种情况下,如果我理解正确,factor(x)中的每个级别都将与z交互。我正在寻找一种方法,只与z交互factor(x)的第一个级别。(即最终只有1个交互系数) - user2081788

0

你可能需要类似这样的东西:

y~factor(x)+factor(x=='SomeLevel'):z

1
这绝对是我正在寻找的概念。然而,它将x分解为TRUE和FALSE,并将两者作为与z的交互进行测试,结果是一个模型,其中x = somelevel:z x!= somelevel:z。我正在尝试仅包含x = somelevel:z。 - user2081788
如何处理剩余部分?也许您需要对数据进行分区,并仅在x == somelevel的情况下建模? - Matthew Lundberg
固定效应模型矩阵秩不足,因此删除1列/系数。 - theforestecologist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接