簡體   English   中英

使用lappy做循環glm

[英]Using lappy to do loop glm

這是我正在嘗試做的一個例子。

第1步 :

創建因變量和自變量組合的列表

a <- list(paste("Sepal.Length ~  Sepal.Width" ) , 
paste("Sepal.Width ~ Sepal.Length" )
)

第2步 :

使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM