在 r 中对 lm 施加截距

机器算法验证 r 术语 流明 截距
2022-04-16 11:44:57

我通过将高维模型的滑动窗口拟合到线性(参数)模型并查看参数值随时间的演变,将高维模型转换为低维模型。我将从 630 万个点增加到 6 个参数的大约 2500 个值。

物理学说截距应该是一个恒定值,但是当我使用 LM 时,它会四处移动。我认为运动是因为噪音,它会导致其他参数值无法正确指示。我想将它设置为一个已知的常数值。

如何在 R 中制作具有规定截距(非零)的线性模型。

当前代码:

for (i in 1:(n-k)){

  fit <- lm(y ~ x1 + x2 + I(x3^2) + x4 + x5 + x6 , data=data[i:(i+k),])

  #STORE PARAMETERS INTO VARIABLES
...  #truncated for brevity
}

不起作用的代码:

  fit <- lm(y ~ I(9.81) + x1 + x2 + I(x3^2) + x4 + x5 + x6 , data=data[i:(i+k),])
  fit <- lm(y ~ 9.81 + x1 + x2 + I(x3^2) + x4 + x5 + x6 , data=data[i:(i+k),])

问题:

  • 我如何规定常数?
  • 我尝试在 google 和 CV 上搜索这个 - 有没有我遗漏的词汇?
  • 您能否评论一下 AIC 或 R2 之类的东西如何受到此模型的影响?我更喜欢使用 AIC 或 BIC,我认为作为模型选择标准,它们应该考虑参数,但 R2 在两者之间发生了根本性的变化(我认为)。
  • 我尝试在 CV 中搜索这个问题的答案,但没有找到。提出了一种替代解决方案,但其形式与要求的形式大不相同。它是关于按摩输入,而不是在不从根本上改变数据的情况下格式化命令。我喜欢(并且发现最有用)的答案是关于输入公式的形式,而不是关于创建新变量。

像往常一样,征求意见和建议。

1个回答

这样的事情应该这样做:

fit <- lm( I(y-9.81) ~ 0 + x1 + x2 + I(x3^2) + x4 + x5 + x6 , data=data[i:(i+k),])

在许多包中应该有类似的东西。

替代:

interc <- rep(9.81,k+1)
fit <- lm(y ~ 0 + x1 + x2 + I(x3^2) + x4 + x5 + x6 + offset(interc),data=data[i:(i+k),])

虽然系数和标准误差应该相同,但第二个的优点之一是它实际上给出了 y 的模型,而不是移动的 y。在某些情况下可能有用。

(如果要测试截距值,请去掉“0+”。)

--

AIC 应该可以正常工作。

R2不会真正起作用 - 至少不是没有一些想法,即使那样,也可能不是你想要的方式。它的含义将从具有截距的模型中改变,因为预先指定的截距实际上是无截距模型(事实上,对于移位的 y)。

取决于具体的计算形式R2,你可能会得到外面的值[0,1],例如,不同的形式可能不是等价的。没有免费拦截会使与仅拦截模型的比较变得棘手。

如果你需要一个R2你需要仔细考虑哪些属性R2你最需要保留,因为你将不得不放弃一些。