如果我测量 X 的特定值的(例如 pH 值),例如(例如温度)并且我想测试天气和之间的关系是线性的吗?(即 :和之间的关系是线性的,和之间的关系不是线性的)。
我的想法
我正在考虑 Pearson 等级测试,但是在进一步阅读时,这似乎实际上不能用于测试线性或模型错误指定测试,但我认为数据集太小,无法通过这样的方法取得任何合理的进展测试。
如果我测量 X 的特定值的(例如 pH 值),例如(例如温度)并且我想测试天气和之间的关系是线性的吗?(即 :和之间的关系是线性的,和之间的关系不是线性的)。
我的想法
我正在考虑 Pearson 等级测试,但是在进一步阅读时,这似乎实际上不能用于测试线性或模型错误指定测试,但我认为数据集太小,无法通过这样的方法取得任何合理的进展测试。
任何等级测试都只会测试单调性,高度非线性的关系当然可以是单调的。所以任何基于等级的测试都没有帮助。
我建议您拟合线性和非线性模型,并评估非线性模型是否通过 ANOVA 解释了大量的方差。这是R中的一个小例子:
set.seed(1)
xx <- runif(100)
yy <- xx^2+rnorm(100,0,0.1)
plot(xx,yy)
model.linear <- lm(yy~xx)
model.squared <- lm(yy~poly(xx,2))
anova(model.linear,model.squared)
Analysis of Variance Table
Model 1: yy ~ xx
Model 2: yy ~ poly(xx, 2)
Res.Df RSS Df Sum of Sq F Pr(>F)
1 98 1.27901
2 97 0.86772 1 0.41129 45.977 9.396e-10 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
在这种特殊情况下,ANOVA 可以正确识别非线性。
当然,您也可以查看比正方形更高的订单。或使用样条而不是无限制的多项式。或谐波。这实际上取决于您想到的具体替代方案,而这又取决于您的具体用例。
我非常喜欢 Stephan Kolassa 的基于方差分析的答案。但是,我也想提供一个稍微不同的观点。
首先,考虑您要测试非线性的原因。如果要检验普通最小二乘的假设来估计简单的线性回归模型,请注意,如果您随后要使用估计的模型进行其他检验(例如,检验和具有统计显着性),由此产生的测试将是一个复合测试,其类型 I 和类型 II 错误率不会是名义错误率。这是多个原因之一,而不是正式测试线性回归的假设,您可能希望使用绘图来了解这些假设是否合理。另一个原因是您执行的测试越多,即使 null 为真,您就越有可能获得显着的测试结果(毕竟,和之间关系的线性并不是简单线性回归模型的唯一假设),与这个原因密切相关的事实是假设测试有自己的假设!
例如,按照 Stephan Kolassa 的例子,让我们建立一个简单的回归模型:
set.seed(1)
xx <- runif(100)
yy <- xx^2+rnorm(100,0,0.1)
plot(xx,yy)
linear.model <- lm(yy ~ xx)
线性模型的plot
函数显示了许多图,其目的正是让您了解线性模型和 OLS 估计方法背后的假设的有效性。和响应之间的线性关系假设是否存在偏差:
plot(linear.model)
您可以清楚地看到拟合值和残差之间存在二次趋势,因此是的线性函数的假设是有问题的。
但是,如果您决定使用统计检验来验证线性假设,那么您将面临一个问题,正如 Stephan Kolassa 所指出的,非线性的可能形式有无数种,因此您不可能设计出一个对所有人进行一次测试。你需要决定你的替代方案,然后你可以测试它们。现在,如果您所有的选择都是polynomials,那么您甚至不需要 ANOVA,因为默认情况下R
计算正交多项式。让我们测试 4 个备选方案,即线性多项式、二次项、三次项和四次项。当然,查看残差与拟合图,这里没有高于 2 阶模型的证据。但是,我们包括更高程度的模型来展示如何在更一般的情况下进行操作。我们只需要一个拟合来比较所有四种模型:
quartic.model <- lm(yy ~ poly(xx,4))
summary(quartic.model)
Call:
lm(formula = yy ~ poly(xx, 4))
Residuals:
Min 1Q Median 3Q Max
-0.175678 -0.061429 -0.007403 0.056324 0.264612
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.33729 0.00947 35.617 < 2e-16 ***
poly(xx, 4)1 2.78089 0.09470 29.365 < 2e-16 ***
poly(xx, 4)2 0.64132 0.09470 6.772 1.05e-09 ***
poly(xx, 4)3 0.04490 0.09470 0.474 0.636
poly(xx, 4)4 0.11722 0.09470 1.238 0.219
如您所见,一阶和二阶项的p值极低,这意味着线性拟合不足,但三阶和四阶项的p值要大得多,这意味着三阶或更高阶模型没有道理。因此,我们选择二度模型。请注意,这仅是有效的,因为R
它正在拟合正交多项式(在拟合原始多项式时不要尝试这样做!)。如果我们使用 ANOVA,结果将是相同的。事实上,这里t统计量的平方等于ANOVA 检验的F统计量:
linear.model <- lm(yy ~ poly(xx,1))
quadratic.model <- lm(yy ~ poly(xx,2))
cubic.model <- lm(yy ~ poly(xx,3))
anova(linear.model, quadratic.model, cubic.model, quartic.model)
Analysis of Variance Table
Model 1: yy ~ poly(xx, 1)
Model 2: yy ~ poly(xx, 2)
Model 3: yy ~ poly(xx, 3)
Model 4: yy ~ poly(xx, 4)
Res.Df RSS Df Sum of Sq F Pr(>F)
1 98 1.27901
2 97 0.86772 1 0.41129 45.8622 1.049e-09 ***
3 96 0.86570 1 0.00202 0.2248 0.6365
4 95 0.85196 1 0.01374 1.5322 0.2188
例如,6.772^2 = 45.85998,考虑到数值误差,这并不完全是 45.8622,但非常接近。
当您想要探索非多项式模型时,ANOVA 测试的优势就会发挥作用,只要它们都是嵌套的。对于每个的预测变量的子集,则两个或多个模型是嵌套的。例如,让我们考虑一个三次样条模型,其中 1 个内部节点位于 xx 的中位数。三次样条基包括线性、二次和三次多项式,因此、和都是以下 的嵌套模型:linear.model
quadratic.model
cubic.model
spline.model
spline.model <- lm(yy ~ bs(xx,knots = quantile(xx,prob=0.5)))
quartic.model
不是 的嵌套模型(spline.model
反之亦然),因此我们必须将其排除在 ANOVA 测试之外:
anova(linear.model, quadratic.model,cubic.model,spline.model)
Analysis of Variance Table
Model 1: yy ~ poly(xx, 1)
Model 2: yy ~ poly(xx, 2)
Model 3: yy ~ poly(xx, 3)
Model 4: yy ~ bs(xx, knots = quantile(xx, prob = 0.5))
Res.Df RSS Df Sum of Sq F Pr(>F)
1 98 1.27901
2 97 0.86772 1 0.41129 46.1651 9.455e-10 ***
3 96 0.86570 1 0.00202 0.2263 0.6354
4 95 0.84637 1 0.01933 2.1699 0.1440
同样,我们看到二次拟合是合理的,但我们没有理由拒绝二次模型的假设,而支持三次拟合或样条拟合替代方案。
最后,如果您还想测试非嵌套模型(例如,您想测试线性模型、样条模型和非线性模型,例如高斯过程),那么我认为没有假设检验为了那个原因。在这种情况下,您最好的选择是交叉验证。
按照@Kolassa 所说的,我建议将非参数模型(类似于三次样条平滑器)拟合到您的数据中,并查看拟合的改进是否显着。
如果我记得很清楚,Hastie 和 Tibshirani 所著的“Generalized Additive Models”一书包含了可用于此目的的测试描述。