簡體   English   中英

在R中進行線性回歸時,如何有條件地降低因子的NA觀察?

[英]How to drop NA observation of factors conditionally when doing linear regression in R?

我想在R中做一個簡單的線性回歸模型。

模型中有三個因子變量。

這個模型是

lm(Exercise ~ Econ + Job + Position)

其中“練習”是數字因變量,即鍛煉的時間量。

“經濟”,“工作”,“職位”都是因素變量。

“經濟”是指一個人是否受雇。 (等級=雇用/未雇用)

“工作”是一個人的工作類型。 這個變量有五個級別。

“職位”是一個人在工作場所的地位。 這個變量也有五個級別。

我試着做一個線性回歸並得到一個錯誤,

"contrasts can be applied only to factors with 2 or more levels"

我認為這個錯誤是由於因子級別的NA,因為如果“Econ”等於“失業”,“作業”和“位置”具有NA值。 (顯然,失業人員沒有工作類型和工作崗位)

如果我像下面分別回歸兩個模型,則不會發生錯誤。

lm(Exercise ~ Econ)

lm(Exercise ~ Job + Position)

但是,我想要一個可以根據需要自動使用變量的模型和一個結果表。 因此,如果“Econ”被“雇用”,則“Job”,“Position”變量用於回歸。 如果“Econ”為“失業”,則“作業”,“位置”變量將自動從模型中刪除。

我想要一個模型而不是兩個模型的原因是通過將所有變量放在模型中,我可以看到“雇佣”的人中“經濟”(就業或失業)的影響

如果我只是倒退

lm(Exercise ~ Job + Position)

我不知道就業的影響。

我想到了一個解決方案,為所有“工作”和“位置”的NA值設置0 ='失業水平',但我不確定這會解決問題,並認為這可能導致多重共線性問題。

有沒有辦法根據一些其他因子變量自動/有條件地丟棄NA觀測值?

以下是我可重復的例子。

    Exercise <- c(50, 30, 25, 44, 32, 50 ,22, 14)
    Econ <- as.factor(c(1, 0, 1, 1, 0, 0, 1, 1)) 
    # 0 = unemployed, 1 =  employed

    Job <- as.factor(c("A", NA, "B", "B", NA, NA, "A", "C"))

    Position <- as.factor(c("Owner", NA,"Employee", "Owner", 
                        NA, NA, "Employee", "Director")) 

    data <- data.frame(Exercise, Econ, Job, Position)

    str(data)

    lm(Exercise ~ Econ + Job + Position)

    lm(Exercise ~ Econ)

    lm(Exercise ~ Job + Position)

這里我想要的是第一個模型lm(Exercise~Econ + Job + Position),但是我得到一個錯誤,因為對於所有Econ = 0(Unemployed),Job和Position值是NA。

如果你真的只是想讓第一個模型運行沒有錯誤(假設你正在使用相同的缺失值處理),那么你可以這樣做。

lm(Exercise ~ as.integer(Econ) + Job + Position)

請注意,您所做的一切與第三個模型的結果相同。

lm(Exercise ~ Job + Position) # third model
lm(Exercise ~ as.integer(Econ) + Job + Position) # first model

coef(lm(Exercise ~ Job + Position))
coef(lm(Exercise ~ as.integer(Econ) + Job + Position))

除非您改變處理缺失值的方式,否則您想要的第一個模型lm(Exercise ~ Econ + Job + Position)將等同於第三個模型lm(Exercise ~ Job + Position)這就是原因。

默認情況下, lm函數中的na.action = na.omit 這意味着將刪除具有預測變量或響應變量的任何缺失值的任何行。 有多種方法可以看到這一點。 一個是應用model.matrix ,這是lm將在引擎蓋下做什么。

model.matrix(Exercise ~ Econ + Job + Position)
  (Intercept) Econ1 JobB JobC PositionEmployee PositionOwner
1           1     1    0    0                0             1
3           1     1    1    0                1             0
4           1     1    1    0                0             1
7           1     1    0    0                1             0
8           1     1    0    1                0             0

正如您已經正確指出的那樣, Econ = 0position = NA完全對齊。 因此, lm正在放棄那些觀察結果,你最終得到的Econ有一個值, lm不知道如何處理單個級別的因子。 我使用as.integer()繞過了這個錯誤,但是,你仍然只得到一個只有一個值的預測器。

接下來, lm將默默地刪除這些預測變量,這就是為什么你在as.integer(Econ)上獲得系數的NA 這是因為singular.ok = TRUE的默認值。

如果你要設置singular.ok = FALSE你會得到一個錯誤,基本上是說你正在嘗試擬合一個只有一個預測變量值的模型。

lm(Exercise ~ as.integer(Econ) + Job + Position, singular.ok = FALSE)
Error in lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) : 
  singular fit encountered

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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