从拟合线性模型中提取独立变量相互作用的均值
Extract mean of independent variable interaction from fitted linear model
我尝试从装有 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)
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
我不确定 为什么 你想要这个,但是从 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
我尝试从装有 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)
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
我不确定 为什么 你想要这个,但是从 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