【发布时间】:2017-03-12 02:32:39
【问题描述】:
这是我第一次发布问题,希望它看起来不会令人困惑。非常感谢您的宝贵时间。
我正在研究一个邮政编码数据集,可以在这里下载:http://statweb.stanford.edu/~tibs/ElemStatLearn/datasets/zip.train.gz http://statweb.stanford.edu/~tibs/ElemStatLearn/datasets/zip.test.gz
总的来说,我的目标是将主成分回归模型与训练数据集上的前 3 台 PC 拟合,因为这些响应变量是 2、3、5 和 8 的手写数字,然后使用测试数据进行预测.我的主要问题是在 X 矩阵上执行 PCA 后,我不确定我是否正确地进行了回归部分。我已将响应变量转换为 2487*4 指标矩阵,并希望拟合多元线性回归模型。但是预测结果不是二项式指标,所以我很困惑我应该如何将预测解释回原始响应变量,即预测为 2、3、5 或 8。还是我完全做了回归部分错误的?这是我的代码如下:
首先,我构建了那些响应变量等于 2、3、5 和 8 的子集:
zip_train <- read.table(gzfile("zip.train.gz"))
zip_test <- read.table(gzfile("zip.test.gz"))
train <- data.frame(zip_train)
train_sub <- train[which(train$V1 == 2 | train$V1 == 3 | train$V1 == 5 | train$V1 == 8),]
test <- data.frame(zip_test)
test_sub <- test[which(test$V1 == 2 | test$V1 == 3 | test$V1 == 5 | test$V1 == 8),]
xtrain <- train_sub[,-1]
xtest <- test_sub[,-1]
ytrain <- train_sub$V1
ytest <- test_sub$V1
其次,我将X矩阵居中,使用svd计算前3个主成分:
cxtrain <- scale(xtrain)
svd.xtrain <- svd(cxtrain)
cxtest <- scale(xtest)
svd.xtest <- svd(cxtest)
utrain.r3 <- svd.xtrain$u[,c(1:3)] # this is the u_r
vtrain.r3 <- svd.xtrain$v[,c(1:3)] # this is the v_r
dtrain.r3 <- svd.xtrain$d[c(1:3)]
Dtrain.r3 <- diag(x=dtrain.r3,ncol=3,nrow=3) # creat the diagonal matrix D with r=3
ztrain.r3 <- cxtrain %*% vtrain.r3 # this is the scores, the new components
utest.r3 <- svd.xtest$u[,c(1:3)]
vtest.r3 <- svd.xtest$v[,c(1:3)]
dtest.r3 <- svd.xtest$d[c(1:3)]
Dtest.r3 <- diag(x=dtest.r3,ncol=3,nrow=3)
ztest.r3 <- cxtest %*% vtest.r3
第三,这是我不确定我是否以正确的方式做的部分,我将响应变量转换为指标矩阵,并执行如下的多元线性回归:
ytrain.ind <-cbind(I(ytrain==2)*1,I(ytrain==3)*1,I(ytrain==5)*1,I(ytrain==8)*1)
ytest.ind <- cbind(I(ytest==2)*1,I(ytest==3)*1,I(ytest==5)*1,I(ytest==8)*1)
mydata <- data.frame(cbind(ztrain.r3,ytrain.ind))
model_train <- lm(cbind(X4,X5,X6,X7)~X1+X2+X3,data=mydata)
new <- data.frame(ztest.r3)
pred <- predict(model_train,newdata=new)
但是,pred 不是指标矩阵,所以我迷失了如何将它们解释回数字并将它们与真实测试数据进行比较以进一步计算预测误差。
【问题讨论】:
-
你考虑过使用
model.matrix
标签: r