2017-04-13 78 views
1

我想區分一個LM對象和一個RLM(強大的LM來自MASS),因爲根據哪種類型的迴歸是我想要執行的一件事或另一件事。因此,fitList可以是lm或rlm模型,它們是列表中所有元素的相同類型。區分lm對象和rlm對象

fitList幾個普通的線性模型的列表:

fitList[[1]]$call 
Output: lm(formula = frmla, data = xList[[i]]) 

而在第二種情況下,fitList幾個健壯的線性模型的列表:

fitList[[1]][1]$call 
Output: rlm(formula = frmla, data = xList[[i]], method = "MM") 

正如你看,獲得這兩種模型所用公式的方式是不同的。我想要一個區分兩者的方法,並告訴我列表是線性模型列表還是強健線性模型列表。經過多次嘗試後,我無法獲得獲取它的方法。

有什麼建議嗎?

+1

您想獲取模型的類,而不是模型的'call'屬性。試試'class(fittry [[1]])' – Benjamin

回答

4

重現的例子:

library(MASS) 
fitlm <- lm(Height ~., trees) 
fitrlm <- rlm(Height ~., trees) 
class(fitlm)[1] 
class(fitrlm)[1] 
3

1)繼承這將返回一個邏輯指示是否對象,fm,是"rlm"類若有和FALSE否則返回TRUE的:

inherits(fm, "rlm") 

例如,

if (inherits(fm, "rlm")) { 
    # process rlm 
} else { 
    # process lm 
} 

如果L是這樣的模型的一個列表,則此處理它們所有:

f <- function(fm) { 
    # if statement above 
} 
lapply(L, f) 

或獲得指示邏輯矢量哪些是"rlm"機型:

sapply(L, inherits, "rlm") 

2)S3調度另一種方法是定義一個process泛型,然後定義一個方法來處理每個類。在這個例子中,我們只返回類的名字,但在你的應用程序中,你將用所有的處理來替換它來處理該類的一個對象。

process <- function(x, ...) UseMethod("process") 
process.rlm <- function(x, ...) "rlm" 
process.lm <- function(x, ...) "lm" 
process.default <- function(x, ...) "error" 

lapply(L, process)