0

当在 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。我需要在迭代算法中运行这个循环几百次,作为一个循环它太慢了。

解循环此代码的另一个好处是获取预测间隔会更方便。

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

提前感谢您的任何想法!

4

1 回答 1

1

我想你想要

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

参见R-intro '11.1 定义统计模型;公式'

于 2013-05-03T08:18:58.373 回答