2016-02-16 35 views
1

我有一個運行線性模型的最大似然估計的腳本。該模型有幾個變量,我需要偶爾改變它們,也許增加或減少一些。以通常的方式來定義似然函數是這樣的:如何根據data.frame列(R)定義函數參數?

LL <- function(beta0, beta1, beta2, mu, sigma){ 
    R = y - beta0*X$x0 + beta1*X$x1 + beta2*X$x2 
    R = dnorm(R, mu, sigma, log = T) 
    -sum(R) 
} 

我有data.frame X在向量y和協變量的因變量:

X <- data.frame(x0 = 1, x1 = runif(100), x2 = runif(100)*2) 
y <- X$x0 + X$x1 + X$x2 + rnorm(100) 

現在變量的量是受變化通過應用程序,我需要重新制定功能,以便爲有在data.frame X.我已經能夠重新制定這更一般的形式列將採取儘可能多的協變量:

cols <- 0:(ncol(X)-1) 
betas <- paste0("beta", cols) 
eqR <- paste0("y - ", paste0(betas, "*X$x", cols, collapse = " - ")) 

LL <- function(beta0, beta1, beta2, mu, sigma){ 
    R = as.formula(eqR) 
    R = dnorm(R, mu, sigma, log = T) 
    -sum(R) 
} 

我仍然在努力尋找一種方法來動態地定義函數,以便它將採用與協變量矩陣中的列相同數量的beta參數。省略號在這裏可能有用嗎?我也試圖與do.call

require(stats4) 
fit <- mle(LL, start = list(beta0 = 0, beta1 = 0, beta2 = 0, mu = 0, sigma = 1)) 

的任何想法:

LL <- function(betas, mu, sigma){ 
    R <- do.call(dnorm(as.formula(eqR), mu, sigma, log = T), betas) 
    -sum(R) 
} 

當你擬合模型,它在初始值的列表中的另一個攔路虎這不起作用?

編輯:

我提出了一些預先與bbmle包:

require(bbmle) 

dfModel <- cbind(y, X) 
cols <- 0:(ncol(X)-1) 
betas <-paste0("beta",cols) 

betaList <- as.list(rep(0), length(betas))) 
names(betaList) <- betas 
initList <- c(betaList, mu = 0, sigma = 1) 

fitML <- mle2(mu ~ dnorm(mean = y - beta0*x0 - beta1*x1 - beta2*x2, sd = sigma), 
       start = initList, 
       data = dfModel) 

上面的示例的工作原理。但是當我嘗試用as.formula事先定義函數時,我無法使它工作。所以以下不起作用。

eqR <- paste0("y - ", paste0(betas, "*x", cols, collapse = " - ")) 

fitML <- mle2(mu ~ dnorm(mean = as.formula(eqR), sd = sigma), 
       start = initList, 
       data = dfModel) 

的錯誤信息是:

錯誤的eval(表達式,ENVIR,enclos):對象beta0'未找到

我懷疑這可能有一些做在dnorm和as.formula之間的範圍 - 衝突?我無法找到解決方法。

回答

0

嘗試這種情況:

betas = c(0,0,0) 
X <- data.frame(x0 = 1, x1 = runif(100), x2 = runif(100)*2) 
y <- apply(X,1,sum) + rnorm(100) 

其中betas是(B0,B1,B2,...等)和其長度必須等於X列數。
因爲X可以有不同數量的列y應該如上定義。

你LL功能應更改爲:

LL <- function(betas, mu, sigma){ 

    R = y - as.matrix(X) %*% as.matrix(betas) 

    R = dnorm(R, mu, sigma, log = T) 
    -sum(R) 
} 

其中%*%是矩陣產品。這是一樣的做得b[1]*X[,1] + b[2]*X[,2] + b[3]*X[,3] + ... + b[n]*X[,n]

隨着這些改變,可以有數據幀X與任何數量的列,betas相同的長度的X列的陣列。

我希望我明白你的需要。

+0

這不起作用,因爲函數LL作爲參數傳遞給函數stats4 :: mle。因此,LL需要以一種列表形式來表達其所有論點,這種列表形式非常不靈活。所以如果我通過例如修改我的模型添加一個變量,我需要在三個位置修改腳本。這是我想避免的。 – Antti