我试图从符合lm()
的模型中得到两个变量的乘积(相互作用)的平均值。
N <- 1000
u <- rnorm(N)
x1 <- rnorm(N)
x2 <- 1 + x1 + rnorm(N)
y <- 1 + x1 + x2 + u
df <- data.frame(y,x1,x2)
fit <- lm(y ~ x1 * x2, data = df)
我可以计算访问$model
的系数的单个变量的平均值。
mean(fit$model[,2])
# verify result
mean(df[,2])
但是,如何在不返回数据的情况下获得交互的平均值。
# Result should be
mean(df$x1*df$x2)
答案 0 :(得分:1)
我不确定为什么你想要这个,但从fit
获取是微不足道的。首先,最好不要使用$
深入研究这样的拟合对象。而是学会使用提取器功能。在这种情况下,对于数据的所有列,同等的mean(fit$model[,2])
将是:
> colMeans(model.frame(fit))
y x1 x2
2.0783225 0.0283555 1.0481141
模型框架只是数据的副本。你想要的是设计矩阵,或者R称之为模型矩阵,毫不奇怪,它是使用model.matrix()
函数获得的。
> head(model.matrix(fit))
(Intercept) x1 x2 x1:x2
1 1 -0.33406119 1.95054087 -0.65160001
2 1 -1.41848058 0.35429591 -0.50256186
3 1 -1.32877702 -0.00783884 0.01041607
4 1 0.54054637 1.34637056 0.72777572
5 1 -0.75686319 -0.36476471 0.27607699
6 1 0.04514449 1.62928315 0.07355316
请注意,响应数据不在设计矩阵中,但在最后一列中是交互项。再次使用colMeans()
获取此设计矩阵的每列的平均值:
> colMeans(model.matrix(fit))
(Intercept) x1 x2 x1:x2
1.0000000 0.0283555 1.0481141 1.0820110
为了完整性,我应该证明这对我的随机数据集是正确的:
> colMeans(transform(df[,-1], interaction = x1 * x2))
x1 x2 interaction
0.0283555 1.0481141 1.0820110
答案 1 :(得分:0)
mean(x1 * x2)
#[1] 0.9009494
mean(do.call("*", fit$model[, c("x1", "x2")]))
#[1] 0.9009494
fit <- lm(y ~ x1 * x2, data = df, x=TRUE)
mean(fit$x[,"x1:x2"])
#[1] 0.9009494