在统计建模中:两种文化 Leo Breiman写道
当前应用的实践是使用拟合优度测试和残差分析来检查数据模型的拟合度。几年前的某个时候,我在七个维度上建立了模拟回归问题,并控制了一定数量的非线性。拟合优度的标准测试直到非线性极端时才拒绝线性。
Breiman没有提供他的模拟的细节。他引用了一篇论文,他说该论文为他的观察提供了理论依据,但该论文尚未发表。
有没有人看到发表的模拟结果或理论论文来支持布里曼的主张?
在统计建模中:两种文化 Leo Breiman写道
当前应用的实践是使用拟合优度测试和残差分析来检查数据模型的拟合度。几年前的某个时候,我在七个维度上建立了模拟回归问题,并控制了一定数量的非线性。拟合优度的标准测试直到非线性极端时才拒绝线性。
Breiman没有提供他的模拟的细节。他引用了一篇论文,他说该论文为他的观察提供了理论依据,但该论文尚未发表。
有没有人看到发表的模拟结果或理论论文来支持布里曼的主张?
Answers:
我创建了一个模拟,该模拟可以回答Breiman的描述,但发现的只有显而易见的结果:结果取决于上下文以及“极端”的含义。
可以说很多,但让我将其限制为通过易于修改的R
代码进行的一个示例,供感兴趣的读者用于自己的调查中。该代码首先建立一个设计矩阵,该矩阵由近似均匀分布的近似正交的独立值组成(这样我们就不会陷入多重共线性问题)。它计算前两个变量之间的单个二次(即非线性)相互作用:这只是可以研究的多种“非线性”中的一种,但至少它是一种常见的,易于理解的变量。然后将所有内容标准化,以便系数可比:
set.seed(41)
p <- 7 # Dimensions
n <- 2^p # Observations
x <- as.matrix(do.call(expand.grid, lapply(as.list(1:p), function(i) c(-1,1))))
x <- x + runif(n*p, min=-1, max=1)
x <- cbind(x, x.12 = x[,1]*x[,2]) # The nonlinear part
x <- apply(x, 2, function(y) (y - mean(y))/sd(y)) # Standardization
对于基本的OLS模型(无非线性),我们必须指定一些系数和残差的标准偏差。这是一组单位系数和可比较的SD:
beta <- rep(c(1,-1), p)[1:p]
sd <- 1
gamma = 1/4 # The standardized interaction term
df <- data.frame(x)
df$y <- x %*% c(beta, gamma) + rnorm(n, sd=sd)
summary(df)
cor(df)*100
plot(df, lower.panel=function(x,y) lines(lowess(y~x)),
upper.panel=function(x,y) points(x,y, pch=".", cex=4))
summary(lm(df$y ~ x))
与其遍历这里的所有输出,不如使用命令的输出来查看这些数据plot
:
下三角形上的最低轨迹显示出相互作用(x.12
)与因变量(y
)之间基本没有线性关系,其他变量与(3 )之间的适度线性关系y
。OLS结果证实:交互几乎没有意义:
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.0263 0.0828 0.32 0.751
xVar1 0.9947 0.0833 11.94 <2e-16 ***
xVar2 -0.8713 0.0842 -10.35 <2e-16 ***
xVar3 1.0709 0.0836 12.81 <2e-16 ***
xVar4 -1.0007 0.0840 -11.92 <2e-16 ***
xVar5 1.0233 0.0836 12.24 <2e-16 ***
xVar6 -0.9514 0.0835 -11.40 <2e-16 ***
xVar7 1.0482 0.0835 12.56 <2e-16 ***
xx.12 0.1902 0.0836 2.27 0.025 *
我将交互作用项的p值用作非线性度的检验:当该p值足够低(您可以选择较低的值)时,我们将检测到非线性。
(这里有一个关于我们到底要寻找的东西的微妙之处。实际上,我们可能需要检查所有7 * 6/2 = 21个可能的二次相互作用,以及可能还有7个二次项,而不是只关注一个项就像这里所做的那样。我们想对这28个相互关联的测试进行校正。我在这里没有明确进行校正,因为我显示的是p值的模拟分布。您可以直接从中读取检测率根据您的显着性阈值结束时的直方图。)
但是,我们不要一次进行这种分析。让我们做很多次,y
根据相同的模型和相同的设计矩阵在每次迭代中生成新的值。为此,我们使用一个函数进行一次迭代并返回交互项的p值:
test <- function(gamma, sd=1) {
y <- x %*% c(beta, gamma) + rnorm(n, sd=sd)
fit <- summary(lm(y ~ x))
m <- coef(fit)
n <- dim(m)[1]
m[n, 4]
}
我选择将模拟结果显示为p值的直方图,以改变gamma
交互作用项的标准化系数。首先,直方图:
h <- function(g, n.trials=1000) {
hist(replicate(n.trials, test(g, sd)), xlim=c(0,1),
main=toString(g), xlab="x1:x2 p-value")
}
par(mfrow=c(2,2)) # Draw a 2 by 2 panel of results
现在要做的工作。每个模拟进行1000次试验需要几秒钟的时间(以及四个独立的模拟,从给定的交互作用项值开始,每次都将其减半):
temp <- sapply(2^(-3:0) * gamma, h)
结果:
x
sd
beta
gamma
x
sd
beta
sd
简而言之,只要您进行正确的设置和解释,这样的模拟就可以证明您的喜好。 这表明,统计学家应该进行自己的探索,以适应他们所面临的特定问题,以便对他们使用的程序的功能和弱点有一个个人的深刻理解。
R
对这些指针还很陌生,并且总是很欣赏。