2013-01-22 22 views
0

我正在運行線性迴歸,其中預測變量被另一個值分類,並且無法爲newdata生成模型化響應。R中的Predict.lm無法識別新數據

首先,我爲預測變量和誤差項生成一些隨機值。然後我構建響應。請注意,預測因子係數取決於分類變量的值。我構建了一個基於預測器及其類別的設計矩陣。

set.seed(1) 

category = c(rep("red", 5), rep("blue",5)) 
x1 = rnorm(10, mean = 1, sd = 1) 
err = rnorm(10, mean = 0, sd = 1) 

y = ifelse(category == "red", x1 * 2, x1 * 3) 
y = y + err 

df = data.frame(x1 = x1, category = category) 

dm = as.data.frame(model.matrix(~ category + 0, data = df)) 
dm = dm * df$x1 

fit = lm(y ~ as.matrix(dm) + 0, data = df) 

# This line will not produce a warning 
predictOne = predict.lm(fit, newdata = dm) 

# This line WILL produce a warning 
predictTwo = predict.lm(fit, newdata = dm[1:5,]) 

的警告是:

'newdata' 有5行,但可變發現有(S)10行

除非我非常錯誤的,我不應該與變量名稱有任何問題。 (這個板子上有一兩個討論提出了這個問題。)請注意,第一個預測運行良好,但第二個預測沒有。唯一的變化是第二次預測只使用設計矩陣的前五行。

想法?

+1

這裏真正的問題是你的,我們應該說,「創造性」嘗試通過'lm'的公式接口指定一個模型。 – joran

+1

'predict.lm'幫助頁面說'newdata'參數需要是一個數據框。警告確實顯得有點偏離目標,但是可以說比當您可能認爲您獲得新預測時默認報告原始數據預測的默認行爲更好。 –

回答

4

我不是100%確定你想要做什麼,但我認爲公式如何工作的一個簡短的步驟將清除你的東西。

其基本思想非常簡單:你傳遞兩個東西,一個公式和一個數據框。公式中的術語應該是全部是數據框中變量的名稱。

現在,您可以得到lm,但沒有嚴格按照該準則工作,但是您只是要求出現問題。所以停下來看看你的模型規範,並考慮R在哪裏尋找東西。

當您撥打lm基本上沒有公式中的名稱實際上在數據框df中找到。所以我懷疑df沒有被使用。

然後如果你打電話給model.frame(fit)你會看到R認爲你的變量應該被調用。注意什麼奇怪?

model.frame(fit) 
      y as.matrix(dm).categoryblue as.matrix(dm).categoryred 
1 2.2588735     0.0000000     0.3735462 
2 2.7571299     0.0000000     1.1836433 
3 -0.2924978     0.0000000     0.1643714 
4 2.9758617     0.0000000     2.5952808 
5 3.7839465     0.0000000     1.3295078 
6 0.4936612     0.1795316     0.0000000 
7 4.4460969     1.4874291     0.0000000 
8 6.1588103     1.7383247     0.0000000 
9 5.5485653     1.5757814     0.0000000 
10 2.6777362     0.6946116     0.0000000 

有什麼叫dmas.matrix(dm).categoryblue?是的,我不這麼認爲。

我懷疑(但我不知道),你的意思做更多的東西是這樣的:

df$y <- y 
fit <- lm(y~category - 1,data = df) 
2

Joran是在正確的軌道上。這個問題與列名有關。我想要做的是創建我自己的設計矩陣,事實上,我不需要這樣做。如果運行與下面的代碼行的模型,它的一帆風順:

fit = lm(y ~ x1:category + 0, data = df) 

即式指定將替換設計矩陣的手動施工。

使用我自己的設計矩陣是我過去所做的事情,適合的參數和診斷正如他們應該做的一樣。我沒有使用預測函數,所以從未知道R丟棄了「data =」參數。警告會很酷。 R是一個苛刻的女主人。