[英]Using lappy to do loop glm
這是我正在嘗試做的一個例子。
創建因變量和自變量組合的列表
a <- list(paste("Sepal.Length ~ Sepal.Width" ) ,
paste("Sepal.Width ~ Sepal.Length" )
)
使用lappy函數在步驟#1中為列表中的每個元素運行glm,還創建一個for循環來測試兩個不同的參數
param <- c("gaussian" , "Gamma" )
for(i in 1:2) {
print(lapply(a , FUN = function(X) glm(X , data = iris ,family = param[i] )))}
有沒有在第二步中不使用for循環的更好方法? 這是我嘗試過的,但是沒有用。
a <-
list(
paste("Sepal.Length ~ Sepal.Width , data = iris , family = "Gaussian" " ) ,
paste("Sepal.Length ~ Sepal.Width , data = iris , family = "Gamma" " ) ,
paste("Sepal.Width ~ Sepal.Length , data = iris , family = "Gaussian" " ) ,
paste("Sepal.Width ~ Sepal.Length , data = iris , family = "Gamma" " )
)
lapply(a , FUN = function(X) glm(X))
您的paste
在這里沒有任何作用。 別說了。 此外,這里也不需要使用字符串。 放他們出去。 參數系列也是如此:這些是函數 ,無需引用它們。
這已經在長度和概念上極大地簡化了代碼。 現在我們有了這個:
models = list(Sepal.Length ~ Sepal.Width, Sepal.Width ~ Sepal.Length)
families = c(gaussian, Gamma)
我們可以應用它:
lapply(models,
function (model) lapply(families,
function (family) glm(model, family, iris)))
…這是一個嵌套的應用程序。 縮進暗示了什么屬於在一起。 由於這有點奇怪,我們還可以使用不同參數的笛卡爾積:
params = as.data.frame(t(expand.grid(models, families)))
lapply(params, function (p) glm(formula = p[[1]], data = iris, family = p[[2]]))
第一行在這里有點晦澀。 expand.grid
允許我們創建所有參數組合的數據框。 這是一個例子:
> expand.grid(1 : 3, c('a', 'b'))
Var1 Var2
1 1 a
2 2 a
3 3 a
4 1 b
5 2 b
6 3 b
不幸的是,此數據幀的方向不lapply
,因此lapply
會使用lapply
,因為這適用於列。 因此,我們t
ranspose它(並將其轉換為一個data.frame
再次,因為t
總是返回一個matrix
)。
這段代碼非常有用,因為它使通過lapply
編寫嵌套循環更具可讀性。 不幸的是,它本身是非常不可讀的,因此我們將其粘貼到一個函數中:
combine_parameters = function (...)
as.data.frame(t(expand.grid(...)))
這使我們可以編寫簡潔易讀的代碼:
models = list(Sepal.Length ~ Sepal.Width, Sepal.Width ~ Sepal.Length)
families = c(gaussian, Gamma)
params = combine_parameters(models, families)
lapply(params, function (p) glm(formula = p[[1]], family = p[[2]]), data = iris)
使用lapply:
lapply(c("gaussian", "Gamma"), function(myFamily){
lapply(c("Sepal.Length ~ Sepal.Width" ,
"Sepal.Width ~ Sepal.Length"), function(myFormula){
glm(formula = myFormula, family = myFamily, data = iris)
})
})
編輯:如@KonradRudolph答案中所述,我們可以將公式作為具有link =
參數的列表傳遞,例如:
lapply(list(gaussian(link = "identity"), Gamma), function(myFamily){
lapply(c("Sepal.Length ~ Sepal.Width" ,
"Sepal.Width ~ Sepal.Length"), function(myFormula){
glm(formula = myFormula, family = myFamily, data = iris)
})
})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.