具有降阶变量的R(lm)变参数估计方程
我想估算一个等式,例如: (其中,条形图表示变量的平均值……这意味着,我希望自动在Z和降级版本的X之间进行交互。到目前为止,我只是事先手动降级变量,并估计:具有降阶变量的R(lm)变参数估计方程,r,R,我想估算一个等式,例如: (其中,条形图表示变量的平均值……这意味着,我希望自动在Z和降级版本的X之间进行交互。到目前为止,我只是事先手动降级变量,并估计: lm(Y ~ .*Z, data= sdata) 这似乎是可行的,但我更愿意使用一种不需要事先手动贬低的解决方案,因为我还希望包括更复杂的术语,例如: 编辑: 根据要求,一个工作代码示例,请注意,在实际情况中,我有大量(且不断变化)的X变量,因此我不想使用硬编码变量: x1 <- runif(100) x2 <- runi
lm(Y ~ .*Z, data= sdata)
这似乎是可行的,但我更愿意使用一种不需要事先手动贬低的解决方案,因为我还希望包括更复杂的术语,例如:
编辑:
根据要求,一个工作代码示例,请注意,在实际情况中,我有大量(且不断变化)的X变量,因此我不想使用硬编码变量:
x1 <- runif(100)
x2 <- runif(100)
Z <- runif(100)
Y <- exp(x1) + exp(x2) + exp(z)
##current way of estimating the first equation:
sdata <- data.frame(Y=Y,Z=Z,x1=x1-mean(x1),x2=x2-mean(x2))
lm(Y ~ .*Z, data= sdata)
##basically what I want is that the following terms, and their interactions with Z are also used:
# X1^2 - mean(X1^2)
# X2^2 - mean(X2^2)
# X1*X2 - mean(X1*X2)
可以。但是,给定前面的描述表达式,例如:Z:X1:X2将对应于:
(X1平均值(X1))*(X2平均值(X2))
,而我想要的是X1*X2平均值(X1*X2)
来表明刻度在公式中起作用:
lm(mpg ~ cyl + scale(disp*hp, scale=F), data=mtcars)
Call:
lm(formula = mpg ~ cyl + scale(disp * hp, scale = F), data = mtcars)
Coefficients:
(Intercept) cyl scale(disp * hp, scale = F)
3.312e+01 -2.105e+00 -4.642e-05
现在,为了进行比较,让我们在公式之外缩放交互:
mtcars$scaled_interaction <- with(mtcars, scale(disp*hp, scale=F))
lm(mpg ~ cyl + scaled_interaction, data=mtcars)
Call:
lm(formula = mpg ~ cyl + scaled_interaction, data = mtcars)
Coefficients:
(Intercept) cyl scaled_interaction
3.312e+01 -2.105e+00 -4.642e-05
备选方案2:使用模型矩阵
# again fit without Z and get model matrix
mod <- lm(Y ~ (.)^2, data= sdata[, names(sdata) != "Z" ])
modmat <- apply(model.matrix(mod), 2, function(x) scale(x, scale=F))
可以按如下方式使用模型矩阵:
modmat <- modmat[, -1] # remove intercept
lm(sdata$Y ~ modmat*sdata$Z)
如果您提供了一个简单的公式,我们可以用它来进行测试,那么If会更容易得到帮助。那么您为什么不把
mean(x)
放在公式中呢?您可能会发现使用I(x*mean(x))
(大写“I”)更容易方法。参见?公式一个投票人能告诉我如何改进我的帖子吗?@Carl,我看不出I
方法将如何帮助我动态地将Z与X*
变量的所有二阶多项式的相互作用包括在内。现在我看不出你的例子是如何在没有仔细阅读的情况下以编程方式工作的。您是否希望代码假定所有未命名为Z
的预测值都应该被降级?也许最好有一个变量的字符向量来降级或不降级…或者一个只包含这些变量的公式,或者其他什么。非常感谢。但我仍然不明白这是如何让我使用循环的。正如我所说的似乎无法执行以下操作:Y~Z+刻度(.^2)*Z
,但必须键入Y~Z+刻度(x1*x2)*Z+刻度(x2*x2)*Z刻度(x1*x1)*Z
,一旦我不仅拥有了x1
和x2
,而且还拥有了一个数量可变的变量来研究update.formula
。我可以想象一个类似f的解决方法
# again fit without Z and get model matrix
mod <- lm(Y ~ (.)^2, data= sdata[, names(sdata) != "Z" ])
modmat <- apply(model.matrix(mod), 2, function(x) scale(x, scale=F))
> head(modmat)
(Intercept) x1 x2 x1:x2
[1,] 0 0.1042908 -0.08989091 -0.01095459
[2,] 0 0.1611867 -0.32677059 -0.05425087
[3,] 0 0.2206845 0.29820499 0.06422944
[4,] 0 0.3462069 -0.15636463 -0.05571430
[5,] 0 0.3194451 -0.38668844 -0.12510551
[6,] 0 -0.4708222 -0.32502269 0.15144812
> round(colMeans(modmat), 2)
(Intercept) x1 x2 x1:x2
0 0 0 0
modmat <- modmat[, -1] # remove intercept
lm(sdata$Y ~ modmat*sdata$Z)
> lm(sdata$Y ~ modmat*sdata$Z)
Call:
lm(formula = sdata$Y ~ modmat * sdata$Z)
Coefficients:
(Intercept) modmatx1 modmatx2 modmatx1:x2 sdata$Z
4.33105 1.56455 1.43979 -0.09206 1.72901
modmatx1:sdata$Z modmatx2:sdata$Z modmatx1:x2:sdata$Z
0.25332 0.38155 -0.66292
> lm(f2, data=sdata)
Call:
lm(formula = f2, data = sdata)
Coefficients:
(Intercept) scale(x1, scale = F) scale(x2, scale = F)
4.33105 1.56455 1.43979
scale(x1 * x2, scale = F) Z scale(x1, scale = F):Z
-0.09206 1.72901 0.25332
scale(x2, scale = F):Z scale(x1 * x2, scale = F):Z
0.38155 -0.66292