我目前正在使用变量选择技术,要求我确定任何给定变量的系数在具有不同变量组合的模型之间是否变化超过20%。我试过了:
abs(model1$coefficients - model2$coefficients)/model1$coefficients
但是矢量长度不一样(因为每个模型中有不同的变量)因此它们没有正确排列。有没有办法在模型中比较系数与相同的变量名称?我可以手工完成这个,但是有50多个系数和10个模型,所以它需要永远。
很抱歉,如果这是显而易见的,但我无法弄清楚。我已经四处寻找答案,指出我正确的方向,但所有这些都与系数的统计比较有关,并且不包括帮助我解决这个问题的代码。
答案 0 :(得分:1)
您不提供任何示例数据,因此我将根据模型y = a + b * x1 + c * x2 + e
模拟数据,其中e ~ N(0, 1)
。
然后我适应两个模型:y ~ x1
和y ~ x1 + x2
并使用自定义函数getEstimates
从两个模型中提取相同预测变量的参数。使用ANOVA评估其他预测因子的重要性也是一个好主意。
# Simulate some data
set.seed(2017);
generateData <- function(a = 1, b = 2, c = -2, nPoints = 1000) {
x1 <- runif(nPoints);
x2 <- runif(nPoints);
y <- a + b * x1 + c * x2 + rnorm(nPoints);
return(data.frame(y = y, x1 = x1, x2 = x2));
}
df <- generateData();
# Fit1: y ~ a + b * x1
fit1 <- lm(y ~ x1, data = df);
# Fit2: y ~ a + b * x1 + c * x2
fit2 <- lm(y ~ x1 + x2, data = df);
# ANOVA to explore importance of variable
anova(fit1, fit2);
#Analysis of Variance Table
#
#Model 1: y ~ x1
#Model 2: y ~ x1 + x2
# Res.Df RSS Df Sum of Sq F Pr(>F)
#1 998 1292.20
#2 997 994.46 1 297.74 298.5 < 2.2e-16 ***
#---
#Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# Function to get estimates for parameter(s) par
# from two models fit1 and fit2
getEstimates <- function(par, fit1, fit2) {
lst <- lapply(par, function(x)
c(summary(fit1)$coef[x, 1], summary(fit2)$coef[x, 1]));
names(lst) <- par;
return(lst);
}
# Get coefficient for predictor x1
est <- getEstimates("x1", fit1, fit2);
根据getEstimates
的输出,您可以计算两个模型之间参数的相对变化。
# Calculate relative change in estimated x1 coefficient from both models
lapply(est, function(x) abs(x[1] - x[2])/x[1]);
#$x1
#[1] 0.0282493