在R中“向量化”这个for循环? (抑制lm中的相互作用主效应)

时间:2013-05-03 01:49:01

标签: r loops optimization statistics

当在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 =某事] / Y [X = 0 ]

但如果我指定

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

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

解码此代码的另一个优点是获得预测间隔会更方便。

(拜托,我不需要关于如何忽略主要效果和拦截是不正确的虔诚评论 - 它通常是,但我可以保证它不在这种情况下。)

提前感谢任何想法!

1 个答案:

答案 0 :(得分:1)

我想你想要

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

请参阅R-intro '11.1 Defining statistical models; formulae'