2013-05-03 21 views
0

當在lm中指定交互時,R默認包含主效應,沒有選項可以禁止它們。這通常是適當和方便的,但是在某些情況下(估計者內部,LHS變量比率等)有些情況下這是不恰當的。「向量化」R中的這個for循環? (抑制lm中的交互主效應)

我已經得到了這個代碼,它可以將一個對數轉換變量適用於響應變量,並且獨立於數據的子集內。

這裏是一個傻尚未再現的例子:

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主要影響的手段。我需要在一個迭代算法運行這個循環數百次,並作爲一個循環是遠遠太慢了

去掉這段代碼的另一個好處是它可以更方便地得到預測間隔

(請注意,我不需要剔除主要效果和攔截是否不恰當 - 它通常是這樣,但我可以保證它不在這種情況下)。

在此先感謝您的任何想法!

+1

Downvote?沒有評論?如果誰冷靜下來,我會很感激,如果能證明我爲什麼不在某個地方,我會爲他提供合理的理由。 – 2013-05-03 02:04:16

+1

雖然我不是downvoter,我可以猜測。你的代碼是不可複製的,另外循環中的步驟也沒有很好的解釋。很難跟蹤你在那裏做什麼,所以不可能確定它是否可以被矢量化,或者是否適合這樣做。請清理它,否則它可能會因爲本地化而被關閉。 – 2013-05-03 02:13:40

+1

爲了解決問題#1,我認爲你最好在你的數據框上使用'split'之類的東西,然後用'data $ expid'拆分,然後用'lapply'或'sapply'拆分每個子集的計算結果。這將刪除'for'循環。我不能評論這個模型是否適合用於這種方法,但是從編碼的角度來看,這會讓你在那裏。 – thelatemail 2013-05-03 02:24:21

回答