Regression 仅与R中因子水平的子集进行交互建模
让我们先看看Regression 仅与R中因子水平的子集进行交互建模,regression,interaction,Regression,Interaction,让我们先看看lm。我有一个连续的解释$X$和一个系数$F$模拟季节性因素(在示例8级别中) 让$\beta$表示$X$的斜率,然后我想建模斜率与因子的相互作用。这是某种物理模型,因此我假设交互作用仅对8个级别中的2个级别有效。 这是如何表述的?我想使用一个普通公式,因为稍后我想将其放入AER包(functiontobit)中的删失回归中 数据如下: N = 50 f = rep(c("s1","s2","s3","s4","s5","s6","s7","s8"),N) fcoeff = rep(
lm
。我有一个连续的解释$X$和一个系数$F$模拟季节性因素(在示例8级别中)
让$\beta$表示$X$的斜率,然后我想建模斜率与因子的相互作用。这是某种物理模型,因此我假设交互作用仅对8个级别中的2个级别有效。
这是如何表述的?我想使用一个普通公式,因为稍后我想将其放入AER
包(functiontobit
)中的删失回归中
数据如下:
N = 50
f = rep(c("s1","s2","s3","s4","s5","s6","s7","s8"),N)
fcoeff = rep(c(-1,-2,-3,-4,-3,-5,-10,-5),N)
beta = rep(c(5,5,5,8,4,5,5,5),N)
set.seed(100)
x = rnorm(8*N)+1
epsilon = rnorm(8*N,sd = sqrt(1/5))
y = x*beta+fcoeff+epsilon
所有交互的拟合都会给出准确的结果
fit <- lm(y~0+x+x*f)
summary(fit)
Call:
lm(formula = y ~ 0 + x + x * f)
Residuals:
Min 1Q Median 3Q Max
-1.41018 -0.30296 0.01818 0.32657 1.20677
Coefficients:
Estimate Std. Error t value Pr(>|t|)
x 5.039064 0.075818 66.463 <2e-16 ***
fs1 -0.945112 0.088072 -10.731 <2e-16 ***
fs2 -2.107483 0.103590 -20.344 <2e-16 ***
fs3 -2.992401 0.088164 -33.941 <2e-16 ***
fs4 -4.054411 0.094878 -42.733 <2e-16 ***
fs5 -2.730448 0.094815 -28.798 <2e-16 ***
fs6 -5.232721 0.102254 -51.174 <2e-16 ***
fs7 -9.969175 0.096307 -103.515 <2e-16 ***
fs8 -4.922782 0.092917 -52.980 <2e-16 ***
x:fs2 -0.006081 0.097748 -0.062 0.950
x:fs3 -0.050684 0.102124 -0.496 0.620
x:fs4 2.988702 0.103652 28.834 <2e-16 ***
x:fs5 -1.196775 0.105139 -11.383 <2e-16 ***
x:fs6 0.099112 0.103811 0.955 0.340
x:fs7 -0.007648 0.110908 -0.069 0.945
x:fs8 -0.107148 0.094346 -1.136 0.257
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.4705 on 384 degrees of freedom
Multiple R-squared: 0.9942, Adjusted R-squared: 0.994
F-statistic: 4120 on 16 and 384 DF, p-value: < 2.2e-16
这个问题的R方面是离题的,但统计方面是主题 请允许我总结一下:您希望对连续变量和分类变量之间的交互进行建模,但只在分类变量的特定级别上建模
我不认为你能在线性模型中做到这一点,至少不能直接做到。但是,您可以按分类变量的级别对数据进行子集,然后仅在某些子集中包含交互。另一种可能是某种形式的回归树,它可能会导致节点被划分为分类变量的级别,但我不知道有什么方法可以将某些交互强制到树中 最简单的方法可能是操纵模型矩阵以删除不需要的列:
xx <- model.matrix(y ~ 0 + x + x*f)
omit <- grep("[:]fs[^45]", colnames(xx))
xx <- xx[, -omit]
lm(y ~ 0 + xx)
谢谢你的回答。你的总结是正确的。我会考虑是否可以将数据子集。我假设我将失去坡度的公共基准面的优良特性。在我的申请表中有一个清晰的解释。是的,我想你会失去它。我只会在有充分理由强制分类变量的其他级别的交互为0的情况下这样做。感谢您提供了伟大的解决方案。对于这个例子,它非常有效。现在我必须将它应用到现实世界的例子中。你能给我一个提示,如何处理所有新列名的预测吗?new.data=data.frame(x,f)然后predict(fit,new.data)将无法正常工作,对吗?也许最好的方法是以创建模型数据帧的相同方式创建预测数据帧:即,用所需的值填充数据帧,为其创建模型矩阵,并将其用作
predict
函数的参数。我还没有测试过这个。我可以建议您使用tobit
而不是lm
进行所有测试,因为我发现predict
的各种版本可能具有特殊性,并且难以使用。您还可以重点学习如何使用最终需要的版本。new.data=data.frame(x,f)new.data.matrix=model.matrix(~0+x+x*f)省略
xx <- model.matrix(y ~ 0 + x + x*f)
omit <- grep("[:]fs[^45]", colnames(xx))
xx <- xx[, -omit]
lm(y ~ 0 + xx)
Call:
lm(formula = y ~ 0 + xx)
Coefficients:
xxx xxfs1 xxfs2 xxfs3 xxfs4 xxfs5 xxfs6 xxfs7 xxfs8 xxx:fs4 xxx:fs5
5.018 -0.929 -2.088 -3.017 -4.054 -2.730 -5.101 -9.958 -5.022 3.010 -1.176