我有一個計算表格和模型的函式(還有更多......):
fun <- function(x, y, formula = y ~ x, data = NULL) {
out <- list()
out$tab <- table(x, y)
out$mod <- glm(formula = formula,
family = binomial,
data = data)
out
}
在該式中,我需要使用x和y在函式呼叫中提供(例如x = DF1$x和y = DF1$y),并從另一資料幀(例如變數a和b從DF2)。我的天真功能失敗了:
fun(x = DF1$x,
y = DF1$y,
formula = y ~ x a b,
data = DF2)
# Error in eval(predvars, data, env) : object 'y' not found
怎樣才能讓GLM搜索x,并y從功能環境?我猜這個問題與非標準評估和/或范圍界定有關,但我不知道如何解決。
示例資料:
smp <- function(x = c(TRUE, FALSE),
size = 1e2) {
sample(x = x,
size = size,
replace = TRUE)
}
DF1 <- data.frame(x = smp(),
y = smp())
DF2 <- data.frame(a = smp(x = LETTERS),
b = smp(x = LETTERS))
uj5u.com熱心網友回復:
為什么不直接在函式中添加x和y插入data呢?
fun <- function(x, y, formula = y ~ x, data = NULL) {
if(length(x) != length(y) |
length(x) != nrow(data) |
length(y) != nrow(data))stop("x, y and data need to be the same length.\n")
data$x <- x
data$y <- y
out <- list()
out$tab <- table(x, y)
out$mod <- glm(formula = formula,
family = binomial,
data = data)
out
}
fun(x = DF1$x,
y = DF1$y,
formula = y ~ x a b,
data = DF2)
# $tab
# y
# x FALSE TRUE
# FALSE 27 29
# TRUE 21 23
#
# $mod
# Call: glm(formula = formula, family = binomial, data = data)
#
# Coefficients:
# (Intercept) xTRUE aB aC aD aE aF aG aH aI aJ
# 3.2761 -1.8197 0.3409 -93.9103 -2.0697 20.6813 -41.5963 -1.1078 18.5921 -1.0857 -36.5442
# aK aL aM aN aO aP aQ aR aS aT aU
# -0.5730 -92.5513 -3.0672 22.8989 -53.6200 -0.9450 0.4626 -3.0672 0.3570 -22.8857 1.8867
# aV aW aX aY aZ bB bC bD bE bF bG
# 2.5307 19.5447 -90.5693 -134.0656 -2.5943 -1.2333 20.7726 110.6790 17.1022 -0.5279 -1.2537
# bH bI bJ bK bL bM bN bO bP bQ bR
# -21.7750 114.0199 20.3766 -42.5031 41.1757 -24.3553 -2.0310 -25.9223 -2.9145 51.2537 70.2707
# bS bT bU bV bW bX bY bZ
# -4.7728 -3.7300 -2.0333 -0.3906 -0.5717 -4.0728 0.8155 -4.4021
#
# Degrees of Freedom: 99 Total (i.e. Null); 48 Residual
# Null Deviance: 138.5
# Residual Deviance: 57.73 AIC: 161.7
#
# Warning message:
# glm.fit: fitted probabilities numerically 0 or 1 occurred
#
uj5u.com熱心網友回復:
@DaveArmstrong 已經被接受的答案是正確的。這個答案解釋了為什么原始版本的代碼會出現錯誤。
@Thomas 在評論中參考了檔案說
如果在資料中找不到,則變數取自環境(公式),通常是呼叫 glm 的環境。
“通常”這個詞在這里很關鍵。確切的規則是,附加到公式的環境是第一次計算公式運算式的環境,因為 ~它實際上是一個函式。它將求值環境附加到公式物件上,當您傳遞物件時,該環境與公式物件保持一致。
如果您運行glm(y ~ x),則無論您在何處呼叫該公式,都會對其進行評估,因此這就是“典型”情況。
在您的示例中,您在呼叫時創建了公式物件
fun(x = DF1$x,
y = DF1$y,
formula = y ~ x a b,
data = DF2)
這意味著全域環境(您進行此呼叫的地方)已附加到公式中,而那里沒有y,因此您收到了錯誤。
如果您formula = y ~ x通過呼叫使用默認值
fun(x = DF1$x,
y = DF1$y,
data = DF2)
沒有formula引數,它會起作用,因為默認引數是在使用它們的函式的評估框架中評估的。由于fun()有區域變數x和y由引數創建,這將是罰款。
您還問為什么data = NULL會在@DaveArmstrong 的函式中作業。他添加x并y使用
data$x <- x
data$y <- y
如果您從 開始data = NULL,第一行將其更改為包含的串列x,第二行添加一個y組件,因此您最終會得到一個包含x和的串列y,這對datain 來說很好glm()。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/370237.html
上一篇:將串列作為函式引數R傳遞
