2012-09-05 145 views
1

我想創建一個函數來計算R中的Box-Cox變換,其中您在一個公式中迭代lambda(lambda)的值以最大化L.我最終需要的是一個向量L ,因此對於lambda中的所有我都有一個對應的L值。for循環創建向量r

y <- c(256,256,231,101,256,213,241,246,207,143,287,240,262,234,146,255,184,161,252,229,283,132,218,113,194,237,181,262,104) 
df <- 28 
n=29 
lambdas <- seq(-3,3,0.001) 
L <- c(rep(NA,length(lambdas))) 


for(i in lambdas) { 
if(i != 0) { 
yprime <- (((y^i)-1)/i) 
} else 
{ yprime <- log(y) 
} 
st2 <- var(yprime) 
L <- (((-df/2)*(log(st2))) + ((i-1)*(df/n)*(sum(log(y))))) 
} 

我通常最終得到L作爲1的向量,計算最終的迭代。

+0

需要分配到L'的'的元素,而不是重新分配'L'。 'L [i] < - (((...)))'。然而,for循環並不是最重要的「R-ish」方式,我相信box-cox已經在package('install.packages('MASS')')中實現了。 – Justin

+0

你沒有對L做任何索引。看看你的最後一行代碼 - 它只是每次通過循環寫入L。添加一個索引,使其工作'L [someindex] < - blah' – Dason

+0

是的,powerTransform將在汽車包裝中實現,但是,我試圖向我的班級展示lamdba-L關係。向L(L [i])添加索引編號並創建一個向量,其中前三個元素是不同的,但其餘6000具有相同的值。 – user1649902

回答

1

使用seq_along生成指數lambdas[]L[]

for(i in seq_along(lambdas)) { 
    if(i != 0) { 
    yprime <- (((y^lambdas[i])-1)/lambdas[i]) 
    } else { 
    yprime <- log(y) 
       } 
    st2 <- var(yprime) 
    L[i] <- (((-df/2)*(log(st2))) + ((lambdas[i]-1)*(df/n)*(sum(log(y))))) 
} 
plot(L)