0

いくつかの木のデータで多変量回帰を実行しています。

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 つの観測値をランダムに削除して回帰を再実行し、MAPE を計算するためにこれら 3 つの観測値を予測しています。

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% の確率で期待どおりに機能し、削除された 3 つの観測値に対して 3 つの予測値を返します。しかし、時折、次の警告が表示されます。

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

コードはほとんどの場合機能し、2 行のオブジェクトがないため、これがどこから来たのかわかりません。このように、それぞれが木のデータを使用する3つの個別の計算があります。私はそれらを共通の変数なしで別々に保とうとしましたが、とにかくお互いに干渉している可能性はありますか? 警告は g のサンプリングの結果ですか? 観測を削除したり、多変量予測を行うより良い方法はありますか? ありがとうございます。

PS - また、ツリーをアタッチすると、自分で呼び出すことはできますが、ツリーMerch.Volなしで直接呼び出すことはできません。大したことではありませんが、明確な説明があれば (きっと) 聞きたいです。trees$Merch.VolDBHHeight

4

1 に答える 1

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 フィルムも参照してください)。

データを添付した後でも Merch.Vol を直接呼び出すことはできないと述べています。列名をよく見ると、正しい列名が実際には Merch.Vol であることに気付くでしょう。最後に余分なドットを付けます。ドル ($) 演算子は列の一致を使用し、データに D という列がない場合でも、trees$D は DBH 列から値を返します。そのため、列名が正確に入力されていなくても、 trees$Merch.Vol も機能します。

于 2013-05-07T05:49:54.650 に答える