2013-05-07 38 views
0

我跑了一些樹木數據的多元迴歸。Predict.lm for Multiple Regression;麻煩new.data

trees 
    Index DBH Height Merch.Vol. 
1  1 8.3  70  10.3 
2  2 8.6  65  10.3 
3  3 8.8  63  10.2 
4  4 10.5  72  16.4 
5  5 10.7  81  18.8 
6  6 10.8  83  19.7 
7  7 11.0  66  15.6 
8  8 11.0  75  18.2 
9  9 11.1  80  22.6 
10 10 11.2  75  19.9 
11 11 11.3  79  24.2 
12 12 11.4  76  21.0 
13 13 11.4  76  21.4 
14 14 11.7  69  21.3 
15 15 12.0  75  19.1 
16 16 12.9  74  22.2 
17 17 12.9  85  33.8 
18 18 13.3  86  27.4 
19 19 13.7  71  25.7 
20 20 13.8  64  24.9 
21 21 14.0  78  34.5 
22 22 14.2  80  31.7 
23 23 14.5  74  36.3 
24 24 16.0  72  38.3 
25 25 16.3  77  42.6 
26 26 17.3  81  55.4 
27 27 17.5  82  55.7 
28 28 17.9  80  58.3 
29 29 18.0  80  51.5 
30 30 18.0  80  51.0 
31 31 20.6  87  77.0 
attach(trees) 

我可以很容易地運行迴歸,但我在預測時遇到了麻煩。我隨機刪除3個觀測值並重新運行迴歸,然後預測這3個觀測值以計算MAPE。

g = sample(2:31,3);g 
mbreg = lm(trees$Merch.Vol[-g]~DBH[-g]+Height[-g]) 
p2 = predict(mbreg,trees[g,2:3]) 
MAPE[2] = MAPE[2] + sum(abs((trees$Merch.Vol[g]-p2)/trees$Merch.Vol[g]))/3 

j = sample(2:31,3);j 
mLR = lm(log(trees$Merch.Vol[-j])~log(DBH[-j])+log(Height[-j])) 
p4 = exp(predict(mLR,trees[j,2:3])) 
MAPE[4] = MAPE[4] + sum(abs((trees$Merch.Vol[j]-p4)/trees$Merch.Vol[j]))/3 

這個工作方式與我預期的一樣,大約80%的時間,返回三個預測值用於三個移除的觀察值。但偶爾我得到警告:

Warning message: 
'newdata' had 3 rows but variable(s) found have 2 rows 

我不知道這是來自作爲代碼工作的大部分時間,我沒有說有兩行的任何對象。我有3個獨立的計算,每個都使用樹數據。我試圖讓他們分開,沒有共同的變數,但是他們可以互相干擾嗎?警告是否來自g的抽樣?是否有更好的方法去除觀察或進行多變量預測?謝謝。

P.S. - 此外,當我附上的樹,我仍然不能直接調用Merch.Vol沒有trees$Merch.Vol雖然我可以通過自己打電話DBHHeight。沒什麼大不了的,但如果有明確的解釋(我敢肯定),我想聽聽。

回答

1

該錯誤可能從在LM()命令子集劃分的公式內的數據莖。這是predict()命令,實際上會引發錯誤。讓我們有一個例子:

# Data 
trees<-structure(list(Index = 1:31, DBH = c(8.3, 8.6, 8.8, 10.5, 10.7, 
10.8, 11, 11, 11.1, 11.2, 11.3, 11.4, 11.4, 11.7, 12, 12.9, 12.9, 
13.3, 13.7, 13.8, 14, 14.2, 14.5, 16, 16.3, 17.3, 17.5, 17.9, 
18, 18, 20.6), Height = c(70L, 65L, 63L, 72L, 81L, 83L, 66L, 
75L, 80L, 75L, 79L, 76L, 76L, 69L, 75L, 74L, 85L, 86L, 71L, 64L, 
78L, 80L, 74L, 72L, 77L, 81L, 82L, 80L, 80L, 80L, 87L), Merch.Vol. = c(10.3, 
10.3, 10.2, 16.4, 18.8, 19.7, 15.6, 18.2, 22.6, 19.9, 24.2, 21, 
21.4, 21.3, 19.1, 22.2, 33.8, 27.4, 25.7, 24.9, 34.5, 31.7, 36.3, 
38.3, 42.6, 55.4, 55.7, 58.3, 51.5, 51, 77)), .Names = c("Index", 
"DBH", "Height", "Merch.Vol"), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", 
"14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", 
"25", "26", "27", "28", "29", "30", "31")) 

# This gives an error 
g = c(3, 19, 5) 
mbreg = lm(Merch.Vol[-g]~DBH[-g]+Height[-g], data=trees) 
p2 = predict(mbreg,trees[g,2:3]) 

# This will work 
# Notice that the object trees2 will contain the new, sampled dataset 
# The model is then fitted on the dataset trees2 
g = c(3, 19, 5) 
trees2<-trees[-g,] 
mbreg = lm(Merch.Vol~DBH+Height, data=trees2) 
p2 = predict(mbreg,trees[g,2:3]) 

子集(或採樣),使用它會刪除錯誤擬合模型前的數據到一個新的對象。您可能希望將您的代碼示例更改爲:

g = sample(2:31,3);g 
trees2<-trees[-g,] 
mbreg = lm(trees$Merch.Vol~DBH+Height, data=trees2) 
p2 = predict(mbreg,trees[g,2:3]) 
MAPE[2] = MAPE[2] + sum(abs((trees$Merch.Vol[g]-p2)/trees$Merch.Vol[g]))/3 

此外,我建議不要使用attach命令。另一種方法是在對lm()的調用中使用data參數。這個參數告訴lm()命令從命名對象中查找公式中提到的變量(參見上面的例子,同樣在R?lm中)。

你提到的附加數據之後,你仍然不能直接調用Merch.Vol。如果仔細查看列名,您可能會注意到正確的列名實際上是Merch.Vol。最後加上一個點。美元($),操作員使用的列匹配,即使你沒有一個叫d列數據,樹木$ d將胸徑列返回值。這就是爲什麼樹$ Merch.Vol也可以工作,即使列名不完全正確。

+1

完美地工作!非常感謝。我仍然不能說我理解子集問題,但我在將來的兩個步驟中沒有問題。並抓住變量名稱。這很尷尬,因爲我以Merch.Vol命名。再次感謝,我知道一個比我更精通的人可以在一分鐘內解決它。 – Jibber3 2013-05-07 14:12:08

+0

@ Jibber3我有問題,當我預測使用較少沒有。的觀察比在訓練模型中的觀察。我實際上是從文件中獲取數據,並使用t = read.table(「input.txt」)而不是數據框。我得到一個警告,指出:警告消息: 1:「newdata」有45行,但發現變量具有8676行 2:在predict.lm(REG,錫):從秩虧配合 預測可能會產生誤導 >我該怎麼辦? – charvi 2014-11-26 18:24:52