2017-11-22 49 views
1

私はRに慣れていません。ldaを使って生成されたグリッド内のすべての点を分類しようとしています。トレーニングセットは、rmvnorm(n,mean,sigma)を使用してランダムに生成された2つのポイントグループです。ここに私のコードは次のとおり `ここRのldaでの予測: 'newdata'には1600の行がありましたが、見つかった変数には200行があります。

# number of samples 
n=100; 

# parameters: G2 
meanG1 = matrix( 
    c(2, 2), # the data elements 
    nrow=1,    # number of rows 
    ncol=2,    # number of columns 
    byrow = TRUE)  # fill matrix by rows 
sigmaG1 = matrix( 
    c(1,0,0,1), # the data elements 
    nrow=2,    # number of rows 
    ncol=2,    # number of columns 
    byrow = TRUE)  # fill matrix by rows 

library(mvtnorm) 

# Generating a matrix G1 with norm distribution 
G1 = rmvnorm(n, meanG1, sigmaG1) 
G1[,3]=1 

# parameters: G2 
meanG2 = matrix( 
    c(0, 0), # the data elements 
    nrow=1,    # number of rows 
    ncol=2,    # number of columns 
    byrow = TRUE)  # fill matrix by rows 
sigmaG2 = matrix( 
    c(1,0.75,0.75,1), # the data elements 
    nrow=2,    # number of rows 
    ncol=2,    # number of columns 
    byrow = TRUE)  # fill matrix by rows 

# # Generating a matrix G2 with norm distribution 
G2 = rmvnorm(n, meanG2, sigmaG2) 

# adding a column as a label = 1 to G1 matrix 
G1 = cbind(G1, 1) 
# adding a column as a label = 2 to G2 matrix 
G2 = cbind(G2, 2)  
# Concatenate both matrices 
G = rbind(G1,G2)  
# Transforming Matrix into dataFrame 
bothGroupsWithLabel <- as.data.frame(G) 
# Shuffling data row-wise 
bothGroupsWithLabel <- bothGroupsWithLabel[sample(nrow(bothGroupsWithLabel)),] 

# plotting the generated matrices 
plot(c(G1[,1]),c(G1[,2]),col="red") 
points(c(G2[,1]),c(G2[,2]),col="blue") 

# Generating a grid 
K = 40; 
seqx1 = seq(min(G1[,1]),max(G1[,1]),length = K) 
seqx2 = seq(min(G1[,2]),max(G1[,2]),length = K) 
myGrid = expand.grid(z1=seqx1,z2=seqx2); 

plot(myGrid[,1],myGrid[,2]) 

library(MASS) 

# Creating a model 
model.lda = lda(bothGroupsWithLabel[,3] ~bothGroupsWithLabel[,1]+bothGroupsWithLabel[,2] , data = bothGroupsWithLabel); 
Ypred = predict(model.lda, newdata=myGrid); 
Ypredgrid = Ypred$class 

私のグリッドは、したがってmyGirdデータフレームのサイズは、40×40点で構成されて自分のデータbothGroupsWithLabel V1 V2 V3 69 2.0683949 0.5779272 1 53 2.1261046 2.0420350 1 118 -1.4502033 -1.4775360 2 148 1.1705251 1.5437296 2 195 0.3100763 -0.2594026 2 40 1.8573633 3.7717020 1

myGrid z1 z2 1 0.1048024 -0.2034172 2 0.2227540 -0.2034172 3 0.3407055 -0.2034172 4 0.4586571 -0.2034172 5 0.5766086 -0.2034172 6 0.6945602 -0.2034172

の一部であります1600行2列。データフレームbothGroupsWithLabelは200行と3列で構成され、最初の2列は点の座標で、3列目はラベル用です。私の問題は私がpredict(model.lda, newdata=myGrid)と呼ぶときです。私はこの警告メッセージを受け取ります: Warning message: 'newdata' had 1600 rows but variables found have 200 rows 私はここで何が欠けていますか?誰でも私を助けてくれますか?

答えて

0

問題は、モデルを生成した方法です。数式とdata=...を使用する場合は、変数名を使用する方が良いでしょう。これを有効にするには、変数名をnewdataに一致させる必要があります。だから、あなたはmyGridは、行を追加作成するとき:

names(myGrid) = c("V1", "V2") 

をして、あなたの最後の数行を可能にする:あなたが望む結果を得る必要があります

model.lda = lda(V3 ~ V1 + V2 , data = bothGroupsWithLabel); 
Ypred = predict(model.lda, newdata=myGrid); 
Ypredgrid = Ypred$class 

+0

ありがとうございました!問題は解決されました! –

関連する問題