【问题标题】:R - creating a linear model with fixed poly() coefficientsR - 创建具有固定 poly() 系数的线性模型
【发布时间】:2015-06-04 01:30:55
【问题描述】:

在 R 中,可以使用公式中的 offset 参数构建具有固定系数的 lm()glm() 对象。

x=seq(1,100)
y=x^2+3*x+7
# Forcing to fit the polynomial: 2x^2 + 4x + 8 
fixed_model = lm(y ~ 0 + offset(8 + 4*x + 2*I(x^2) ))

是否可以使用poly() 做同样的事情?我尝试了下面的代码,但它似乎不起作用。

fixed_model_w_poly <- lm(y ~ 0 + offset(poly(x, order=2, raw = TRUE, coefs= c(8, 4, 2))))

错误:偏移量为 200,应等于 100(观察次数)

我想使用poly() 作为方便的接口来运行具有大量固定系数或阶值的迭代,而不必为每个阶/系数组合手动编码:offset(8 + 4*x + 2*I(x^2) )


P.S:更多但不是必要的信息:这是进入 MCMC 例程。因此,示例用法是在以下代码中生成(然后比较)model_currentmodel_next

library(MASS)
coeffs_current <- c(8, 4, 2)
model_current <- lm(y ~ 0 + offset(poly(x, order=2, raw = TRUE, coefs= coeffs_current )))
cov <- diag(rep(1,3))
coeffs_next <- mvrnorm(1, mu = as.numeric(coeffs_current ),
                       Sigma = cov ) 
model_next <- lm(y ~ 0 + offset(poly(x, order=2, raw = TRUE, coeffs_next ))

【问题讨论】:

  • 不明白访问fixed_model$residuals的难度
  • @BondedDust,我编辑了问题以澄清。那不是问题。我正在尝试使用poly() 创建固定模型,在这里我可以轻松地输入固定系数和我想要的顺序,而不是手动在公式中编写offset(8 + 4*x + 2*I(x^2) ))
  • 提供一个示例,说明您期望系数如何进入此过程。在查看了poly(.)-result 的帮助页面和结构后,我不清楚如何继续,所以我认为使用更自动化的方法来构建具有所需偏移量的公式会更容易。 (只要您使用残差,我认为您应该避免与不使用 poly() 相关的陷阱。
  • @ BondedDust,我在问题的底部添加了一个简化的用法示例 - 实际上,model_currentmodel_next 在马尔可夫链蒙特卡罗例程中分别象征着我当前和提议的模型.
  • 我不明白..代码和数据都包含在问题中,它们可以按原样运行。您不需要任何进一步的信息、特定数据即可重现该问题。

标签: r distribution lm polynomials


【解决方案1】:

这证明了我的建议。 (使用poly。)

library(MASS)
# coeffs_current <- c(8, 4, 2) Name change for compactness.
cc <- c(8, 4, 2)
form <- as.formula(bquote(y~x+offset(.(cc[1])+x*.(cc[2])+.(cc[3])*I(x^2) )))
model_current <- lm(form, data=dat))

我真的不知道你打算用这个下一个代码做什么。看起来您想要基于先前函数的输入的东西,但看起来您不想要基于结果的东西。

cov <- diag(rep(1,3))
coeffs_next <- mvrnorm(1, mu = as.numeric(cc ),
                       Sigma = cov )

代码在一个简单的测试用例中工作(至少如我所愿)。 bquote 函数将值替换为表达式(实际上是调用),as.formula 函数计算其参数,然后将结果修饰为正确的formula-object。

dat <- data.frame(x=rnorm(20), y=rnorm(20) )
cc <- c(8, 4, 2)
form <- as.formula( bquote(y~x+offset(.(cc[1])+x*.(cc[2])+.(cc[3])*I(x^2) )))
model_current <- lm(form, data=dat)
#--------
> model_current

Call:
lm(formula = form, data = dat)

Coefficients:
(Intercept)            x  
     -9.372       -5.326    # Bizarre results due to the offset.
#--------
form
#y ~ x + offset(8 + x * 4 + 2 * I(x^2))

【讨论】:

  • 如果您在公式构造之前进行了随机变量绘制,则应该可以在循环中重复第二步或传递给replicate
  • 再次感谢@BondedDust。我可以使用相同的 bquote 方法,与 rep() 混合以生成具有不同阶数的多项式方程,这对吗? (不只是 2 个)
  • 我不明白为什么不这样做。它只是 bquote 中的表达式文本。它确实被解析了,所以它需要是parse()-able:这成功了:bquote( poly(x, degree=.(cc[1]) ) )。不过,我不确定rep。这与replicate 的功能不同。
  • 我想我很接近但没能做到正确,这给出了正确的结构:replicate(length(cc), paste('cc[[',i,']]*I(x^',i, ') + ', sep='')) 除了最后的多余+。我是否必须使用apply 的形式来增加i
  • 当我建议replicate 时,我假设您将在replicate()-ed 的表达式集中有一个随机数生成步骤。你似乎在外面做那一代,在那种情况下,复制不是控制结构的正确选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-08
  • 2020-03-09
  • 1970-01-01
  • 2014-07-26
  • 2011-11-12
  • 2015-02-21
  • 1970-01-01
相关资源
最近更新 更多