使用lm,我想适合模型: y = b0 + b1 * x1 + b2 * x2 + b1 * b2 * x1 * x2
我的问题是: 如何指定相互作用的系数应该等于系数乘以主效应?
我已经看到将系数设置为特定值,您可以使用offset()和I(),但我不知道如何指定系数之间的关系。
这是一个简单的模拟数据集:
n <- 50 # Sample size
x1 <- rnorm(n, 1:n, 0.5) # Independent variable 1
x2 <- rnorm(n, 1:n, 0.5) # Independent variable 2
b0 <- 1
b1 <- 0.5
b2 <- 0.2
y <- b0 + b1*x1 + b2*x2 + b1*b2*x1*x2 + rnorm(n,0,0.1)
为了拟合模型1:y = b0 + b1 * x1 + b2 * x2 + b3 * x1 * x2,我会使用:
summary(lm(y~ x1 + x2 + x1:x2))
但我如何拟合模型2:y = b0 + b1 * x1 + b2 * x2 + b1 * b2 * x1 * x2?
两个模型之间的主要差异之一是要估算的参数数量。在模型1中,我们估计4个参数:b0(截距),b1(变量1的斜率),b2(变量2的斜率)和b3(变量1和2之间的相互作用的斜率)。在模型2中,我们估计3个参数:b0(截距),b1(变量1的斜率和变量1和2之间的相互作用的斜率的一部分)和b2(变量2的斜率和部分的斜率)。变量之间相互作用的斜率.1&amp; 2)
我想这样做的原因是在调查x1和&amp;之间是否存在显着的相互作用时。 x2,模型2,y = b0 + b1 * x1 + b2 * x2 + b1 * b2 * x1 * x2,可以是比y = b0 + b1 * x1 + b2 * x2更好的零模型。
非常感谢!
玛丽
答案 0 :(得分:5)
由于您对系数施加的约束,您指定的模型不是线性模型,因此lm
不能用于拟合它。您需要使用非线性回归,例如nls
。
> summary(nls(y ~ b0 + b1*x1 + b2*x2 + b1*b2*x1*x2, start=list(b0=0, b1=1, b2=1)))
Formula: y ~ b0 + b1 * x1 + b2 * x2 + b1 * b2 * x1 * x2
Parameters:
Estimate Std. Error t value Pr(>|t|)
b0 0.987203 0.049713 19.86 <2e-16 ***
b1 0.494438 0.007803 63.37 <2e-16 ***
b2 0.202396 0.003359 60.25 <2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.1121 on 47 degrees of freedom
Number of iterations to convergence: 5
Achieved convergence tolerance: 2.545e-06
当您将其重新编写为
时,您确实可以看到该模型是非线性的> summary(nls(y ~ b0+(1+b1*x1)*(1+b2*x2)-1, start=list(b0=0, b1=1, b2=1)))
Formula: y ~ b0 + (1 + b1 * x1) * (1 + b2 * x2) - 1
Parameters:
Estimate Std. Error t value Pr(>|t|)
b0 0.987203 0.049713 19.86 <2e-16 ***
b1 0.494438 0.007803 63.37 <2e-16 ***
b2 0.202396 0.003359 60.25 <2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.1121 on 47 degrees of freedom
Number of iterations to convergence: 5
Achieved convergence tolerance: 2.25e-06
答案 1 :(得分:5)
Brian提供了一种方法来拟合您指定的约束模型,但如果您对无约束模型比拟约束模型更合适感兴趣,可以使用delta方法来检验该假设。
# Let's make some fake data where the constrained model is true
n <- 100
b0 <- 2
b1 <- .2
b2 <- -1.3
b3 <- b1 * b2
sigma <- 1
x1 <- rnorm(n)
# make x1 and x2 correlated for giggles
x2 <- x1 + rnorm(n)
# Generate data according to the model
y <- b0 + b1*x1 + b2*x2 + b3*x1*x2 + rnorm(n, 0, sigma)
# Fit full model y = b0 + b1*x1 + b2*x3 + b3*x1*x2 + error
o <- lm(y ~ x1 + x2 + x1:x2)
# If we want to do a hypothesis test of Ho: b3 = b1*b2
# this is the same as Ho: b3 - b1*b2 = 0
library(msm)
# Get estimate of the difference specified in the null
est <- unname(coef(o)["x1:x2"] - coef(o)["x1"] * coef(o)["x2"])
# Use the delta method to get a standard error for
# this difference
standerr <- deltamethod(~ x4 - x3*x2, coef(o), vcov(o))
# Calculate a test statistic. We're relying on asymptotic
# arguments here so hopefully we have a decent sample size
z <- est/standerr
# Calculate p-value
pval <- 2 * pnorm(-abs(z))
pval
我解释了delta方法的用途,以及如何在this blog post中的R中使用它。
扩展Brian的答案你可以通过比较完整模型和约束模型来做到这一点 - 但是你必须使用nls来拟合整个模型才能轻松比较模型。
o2 <- nls(y ~ b0 + b1*x1 + b2*x2 + b1*b2*x1*x2, start=list(b0=0, b1=1, b2=1))
o3 <- nls(y ~ b0 + b1*x1 + b2*x2 + b3*x1*x2, start = list(b0 = 0, b1 = 1, b2 = 1, b3 = 1))
anova(o2, o3)
答案 2 :(得分:1)
在lm
中没有办法满足你的要求而且没有理由能够做到这一点。您运行lm
来估算系数。如果您不想估计系数,则不要在模型中包含预测变量。您可以使用coef
提取所需的系数,然后将它们相乘。
请注意,保留交互是一个不同的模型,将生成不同的b1和b2。您可以选择保留I(x1 * x2)
而不使用系数。
至于你为什么要这样做,你的约束模型实际上比简单的加法模型更合适并不是一个好的先验理由。拥有更多免费参数必然意味着模型更适合但你没有添加,你已经添加了一个约束,在现实世界中,它可以使它更适合。在这种情况下,你会认为它是一个更好的“基线”,用于与包括交互的模型进行比较吗?