【问题标题】:"Vectorizing" this for-loop in R? (suppressing interaction main effects in lm)在R中“矢量化”这个for循环? (抑制 lm 中的交互主效应)
【发布时间】:2013-05-03 01:49:00
【问题描述】:

当在 lm 中指定交互时,R 默认包括主效应,没有抑制它们的选项。这通常是合适且方便的,但在某些情况下(在估计器、比率 LHS 变量等中)这是不合适的。

我有这段代码可以将一个对数转换的变量拟合到一个响应变量,独立地在数据的子集中。

这是一个愚蠢但可重复的例子:

id = as.factor(c(1,2,2,3,3,3,4,4,4,4,5,5,5,5,6,7,7,8,8,8,9,9,9,9,10))
x = rexp(length(id))
y = rnorm(length(id))
logx = log(x)
data = data.frame(id,y,logx)

for (i in data$id){
    sub = subset(data, id==i)   #This splits the data by id
    m = lm(y~logx-1,data=sub)   #This gives me the linear (log) fit for one of my id's
    sub$x.tilde = log(1+3)*m$coef   #This linearizes it and gives me the expected value for x=3
    data$x.tilde[data$id==i] = sub$x.tilde #This puts it back into the main dataset
    data$tildecoeff[data$id==i] = m$coef #This saves the coefficient (I use it elsewhere for plotting)
    }

我想拟合如下模型:

Y = B(X*id) +e

没有拦截,也没有id 的主要影响。从循环中可以看出,我对 X=3 时 Y 的期望感兴趣,通过原点约束拟合(因为 Y 是 Y[X=something]/Y[X=0 ]。

但是如果我指定

m = lm(Y~X*as.factor(id)-1)

没有办法抑制id 的主要影响。我需要在迭代算法中运行这个循环数百次,作为一个循环,它太慢了。

去循环这段代码的另一个好处是它会更方便地获得预测区间。

(拜托,我不需要虔诚的 cmets 说省略主效应和截距是不恰当的——通常是这样,但我可以保证在这种情况下不是这样)。

提前感谢您的任何想法!

【问题讨论】:

  • 投反对票?没有评论?如果投反对票的人能够表现出体面,为我为什么不合时宜提供理由,我将不胜感激。
  • 虽然我不是反对者,但我可以猜到。您的代码不可重现,此外循环中的步骤也没有得到很好的解释。很难跟踪您在那里所做的事情,因此无法确定它是否可以被矢量化,或者是否适合这样做。请清理它,否则它可能会因为过于本地化而被投票关闭。
  • 要解决问题 #1,我认为您最好在数据帧上使用 split 之类的东西,然后按 data$expid 拆分,然后将 lapplysapply 拆分为每个计算子集。这将删除for 循环。我无法评论该模型在统计上是否适合在此方法中使用,但从编码的角度来看,这会让你到达那里。
  • 感谢您的评论,但我认为如果我可以只拟合具有交互作用且没有主效应的模型会更快。如果我能做到这一点,我可以使用predict(m, newdata=data.frame(id=data$id,x = rep(log(1+3),length=nrow(data))) 从而丢失循环的最后两行
  • 我不认为这个问题的前提是正确的。 lm(y~x1:x2) 适合只有交互项但没有主效应的模型...

标签: r loops optimization statistics


【解决方案1】:

我想你想要

m <- lm(y ~ 0 + logx : as.factor(id))

R-intro '11.1 Defining statistical models; formulae'

【讨论】:

  • 有时显而易见的事情是最难用谷歌搜索的。谢谢!
猜你喜欢
  • 2018-12-08
  • 2020-05-03
  • 1970-01-01
  • 2023-03-21
  • 2019-02-28
  • 1970-01-01
  • 1970-01-01
  • 2014-10-03
相关资源
最近更新 更多