簡體   English   中英

如何運行for循環以通過虛擬變量運行回歸

[英]How to run a for loop to run regressions by dummy variables

我有以下代碼:

reg <- lm(Y ~ x1 + x1_sq + x2 + x2_sq + x1x2 + d2 + d3 + d4, df)

其中所有x_i是連續變量,而d_i是互斥的虛擬變量(存在d1,但為了避免完全多重共線性而排除了)。 我不想為每個虛擬變量== 1運行單獨的回歸,而是希望通過以下形式的循環來實現此目的:

dummylist <- list("d1", "d2", "d3", "d4")
for(i in dummylist){
   if(i==1){
      ireg <- lm(Y ~ x1 + x1_sq + x2 + x2_sq + x1x2, df)
   } else {
      Unsure what to put here
   }
}

我的三個問題是:

  1. 在-if-函數的第一部分中,我是否只為代碼生成“ d1reg,d2reg等”結果而在“ reg”之前包含“ i”? 和,
  2. 包括在上面的代碼中,在-else-語句之后我應該輸入什么?
  3. 這一切都引出了一個問題,是否在if-else語句放入-for-循環是錯誤的方法/是否有更合適的循環?

抱歉,如果太多,請讓我知道,我可以將其減少或分成多個問題。 我找不到類似的問題,可能是因為我剛開始在R中運行循環並且不知道要查找什么。

  1. 在-if-函數的第一部分中,我是否只為代碼生成“ d1reg,d2reg等”結果而在“ reg”之前包含“ i”?

簡短:

在R中,有許多數據類型。 list對象是用途最廣泛的一種,它可以存儲任何類型的對象。 或者,可以創建一種environment來存儲列表,但這有點過頭了。

如果您大致知道列表中應包含多少個元素,最簡單的方法是在循環之前將其初始化為

n <- 3
regList <- vector(mode = "list", length = n)
# Optional naming:
#names(regList) <- c("d1 reg", "d2 reg", "d3 reg")

在循環中,然后迭代地填寫列表:

for(i in seq_along(regList)){
   regList[[i]] <- lm(...)
}
  1. 在-else-語句之后我該怎么辦? 這一切都引出一個問題,

目前尚不清楚您想要什么。 您只想“包括”單獨的虛擬變量。 為此,最簡單的方法可能是保存formula並進行迭代更新。

form <- Y ~ x1 + x1_sq + x2 + x2_sq + x1x2
for(i in seq_along(regList)){
   #paste0 combine strings. ". ~ . + d1" means take the formula and add the element d1 
   form <- update(form, as.formula(paste0(". ~ . + d", i)) 
   regList[[i]] <- lm(form, data = df)
}

也許您實際上正在嘗試對d[i] == 1的子集運行單獨的回歸。 這實際上可以通過lm本身完成

form <- Y ~ x1 + x1_sq + x2 + x2_sq + x1x2
d <- list(d1, d2, d3)
for(i in seq_along(regList)){
   #Using the subset argument
   regList[[i]] <- lm(form, data = df, subset = which(d[[i]] == 1))
   #Alternatively:
   #regList[[i]] <- lm(form, data = subset(df, d[[i]] == 1))
}

免責聲明: d1,d2,d3是否為df的一部分尚不清楚。 在這種情況下,以下示例將起作用

   regList[[i]] <- with(df, lm(form, subset = which(d[[i]] == 1)))
  1. 是將if-else語句放在-for-循環內是錯誤的方法/是否存在更合適的循環?

在這種情況下,這顯然不是正確的方法。 但這在所有情況下都不是錯誤的方法。 在這里,它只是沒有明確的目的。 並請注意, i in dummylisti in dummylist將返回"d1", "d2", "d3", "d4"因為變量已被引用,而不是直接放置在列表中。

但是要解決的另一件事是,在執行線性回歸之前,是否已對變量進行了變換。 請注意, R的內部函數允許您直接在formula執行此操作,並且這樣做可以幫助您避免虛假的錯誤,例如測試存在交互的變量,除非它非常符合您的要求去做。 例如我假設x1_sq = x1^2 也許d1, d2, d3都包含在變量d 在這些情況下,應使用原始變量,如下所示:

lm(formula = Y ~ poly(x1, 2, raw = TRUE) + poly(x2, 2, raw = TRUE) + x1:x2, data = df ) #+d if d1, d2, d3 is part of the formula

poly是二階多項式,並且raw = TRUE返回參數x1 + I(x1^2)而不是正交表示。

如果一個人這樣做,輸出drop1anova等,將考慮到它不應該考第一順序變量二階相互作用。

暫無
暫無

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

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