2013-02-27 62 views
6

的r predict功能可以採取newdata參數和它的文檔讀取:飼養newdata至R預測函數

newdata在其中尋找與預測變量的可選數據幀。如果省略,則使用擬合值。

但是我發現這並不是完全真實的,這取決於模型是否合適。例如,下面的代碼按預期工作:

x <- rnorm(200, sd=10) 
y <- x + rnorm(200, sd=1) 
data <- data.frame(x, y) 
train = sample(1:length(x), size=length(x)/2, replace=F) 
dataTrain <- data[train,] 
dataTest <- data[-train,] 
m <- lm(y ~ x, data=dataTrain) 
head(predict(m,type="response")) 
head(predict(m,newdata=dataTest,type="response")) 

但是,如果模型適合這樣:

m2 <- lm(dataTrain$y ~ dataTrain$x) 
head(predict(m2,type="response")) 
head(predict(m2,newdata=dataTest,type="response")) 

最後兩線會產生相同的結果。 predict函數以忽略newdata參數的方式工作,即它根本不能真正計算對新數據的預測。

當然,罪魁禍首是lm(y ~ x, data=dataTrain)lm(dataTrain$y ~ dataTrain$x)。但是我沒有找到任何提到這兩者之間區別的文件。這是一個已知的問題嗎?

我使用R 2.15.2。

+0

嗨,我有同樣的問題,你有沒有想辦法解決這個問題?在此先感謝 – jbest 2015-05-14 10:43:56

回答

11

?predict.lm和注意事項部分中,我引用如下:

Note: 

    Variables are first looked for in ‘newdata’ and then searched for 
    in the usual way (which will include the environment of the 
    formula used in the fit). A warning will be given if the 
    variables found are not of the same length as those in ‘newdata’ 
    if it was supplied. 

雖然它並不在「同名」條款等,儘可能的公式有關條款幽州行爲傳遞給它的形式爲foo$var,並且在newdata中或者R沿着搜索路徑尋找它們的搜索路徑中不存在名稱類似的變量。

在第二種情況下,您完全濫用模型公式表示法;這個想法是簡潔而象徵性地描述模型。簡潔和重複數據對象廣告nauseum不兼容。

您注意到的行爲是,確切地說與記錄的行爲一致。簡而言之,您使用條款data$xdata$y來擬合模型,然後嘗試預測條款xy。就R而言,這些是不同的名稱,因此也是不同的東西,它們確實不符合它們。

+0

我認爲這意味着'你用條款數據$ x和數據$ y擬合模型,然後嘗試預測條款x和y'。但我明白你的觀點。感謝您的澄清。 – edwardw 2013-02-27 15:34:35

+0

@edwardw是的,對不起。現在修復。 – 2013-02-27 15:36:48

+2

冒着沮喪的風險:讓我們面對現實吧,這本手冊不太直觀。例如,如果按照數據框列的形式傳遞模型,就像'lm(mydata $ y〜mydata $ x,...)'那樣,當您想要傳遞'mydata ='時,準備好各種各樣的驚喜。預測()'。該欄應該叫做'x'嗎? '$ MYDATA x'?還有其他的東西?:-)我沒有弄明白,只是將列複製到獨立的'x'和'y'向量中,並且在閱讀了這個優秀的解釋之後,我可以使用'predict(model,mydata = data.frame (X =什麼),...)'。 – 2015-03-13 16:02:02