我有一個運行線性模型的最大似然估計的腳本。該模型有幾個變量,我需要偶爾改變它們,也許增加或減少一些。以通常的方式來定義似然函數是這樣的:如何根據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之間的範圍 - 衝突?我無法找到解決方法。
這不起作用,因爲函數LL作爲參數傳遞給函數stats4 :: mle。因此,LL需要以一種列表形式來表達其所有論點,這種列表形式非常不靈活。所以如果我通過例如修改我的模型添加一個變量,我需要在三個位置修改腳本。這是我想避免的。 – Antti