我有四个预测变量,用于预测一个名为“退出”的变量,我正在尝试运行一个多元回归模型来查看它们是如何相互作用的。但是,当模型返回其摘要时,两个三向交互项表示为缺失 (NA)。我查看了相关矩阵,我相当确定这不是共线性问题。有没有人知道可能会发生什么/如何解决这个问题?
我也尝试过居中和缩放我的数据,但问题仍然存在。
# First, I tried to put my predictor variables (q1-q4) and outcome variable all into one dataframe & rename them accordingly
interaction_data <- responses_vals %>%
mutate("quit" = participant_data$Klein_Quit_Intentions_Scale) %>%
rename("affthreat" = "q1",
"insthreat" = "q2",
"affbehav" = "q3",
"insbehav" = "q4")
# then, I center scaled the data and ran the interaction analysis
interaction_data <- as.data.frame(scale(interaction_data))
lin_reg <- lm(quit ~ (affthreat*insthreat*affbehav*insbehav),
data = as.data.frame(interaction_data))
summary(lin_reg)
总结的输出如下。正如您所看到的,有 2 个三向交互缺失,并标记为“NA”,即使我的所有列都没有缺失值。
任何见解将不胜感激!谢谢!
系数为NA的情况有两种。
当您的预测变量多于观测值时。即您无法估计所有系数。在这种情况下,即使是标准误差也将为 NA,而 t-tests/p-values 都将为 NA。您使用半图来确定效果
当有完整的别名时。
你的情况,你遇到的是第二种情况。完全相同的两列。或完全没有随机性的其他列的组合派生的列。尝试使用函数
alias
来确定完全相同的列:
例子:
example('alias')
summary.lm(npk.aov)
Call:
aov(formula = yield ~ block + N * P * K, data = npk)
Residuals:
Min 1Q Median 3Q Max
-5.3000 -1.6833 0.1583 1.9979 4.4750
Coefficients: (1 not defined because of singularities)
Estimate Std. Error t value Pr(>|t|)
(Intercept) 54.8750 0.8021 68.415 < 2e-16 ***
block1 1.7125 1.3893 1.233 0.24131
block2 1.6792 0.8021 2.093 0.05822 .
block3 -1.8229 0.5672 -3.214 0.00744 **
block4 -1.0137 0.4393 -2.308 0.03965 *
block5 0.2950 0.3587 0.822 0.42689
N1 2.8083 0.8021 3.501 0.00437 **
P1 -0.5917 0.8021 -0.738 0.47490
K1 -1.9917 0.8021 -2.483 0.02880 *
N1:P1 -0.9417 0.8021 -1.174 0.26317
N1:K1 -1.1750 0.8021 -1.465 0.16865
P1:K1 0.1417 0.8021 0.177 0.86275
N1:P1:K1 NA NA NA NA
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 3.929 on 12 degrees of freedom
Multiple R-squared: 0.7886, Adjusted R-squared: 0.5948
F-statistic: 4.069 on 11 and 12 DF, p-value: 0.01156
在上面的例子中
N1:P1:K1
是 NA
那是因为它线性依赖于其他列:
alias(lm(npk.aov))
Model :
yield ~ block + N * P * K
Complete :
(Intercept) block2 block3 block4 block5 block6 N1 P1 K1 N1:P1 N1:K1 P1:K1
N1:P1:K1 0 1/4 1/4 1/4 0 0 -1/4 -1/4 -1/4 1/2 1/2 1/2
这意味着如果我们采用
1/4*block2+1/4*block3 + ...+1/2*P1:K1
它将与 N1:P1:K1
完全相同
mod_mat <- model.matrix(lm(npk.aov))
alias_coef <- c(alias(lm(npk.aov))$Complete)
cbind(mod_mat[,13], round(mod_mat[,-13]%*%alias_coef,10))
[,1] [,2]
1 0 0
2 0 0
3 0 0
4 0 0
5 0 0
6 1 1
7 0 0
8 0 0
9 0 0
10 1 1
11 0 0
12 0 0
13 0 0
14 1 1
15 0 0
16 0 0
17 0 0
18 0 0
19 0 0
20 0 0
21 0 0
22 0 0
23 0 0
24 0 0