矩阵乘法运算符/函数,如"%*%"
、crossprod
和tcrossprod
,期望传入的矩阵是“numeric”、“complex”或“logical”模式。但是,您的矩阵是“character”模式。
library(mlbench)
data(BreastCancer)
X <- as.matrix(BreastCancer[, 1:10])
mode(X)
你可能会感到惊讶,因为数据集似乎包含数字数据:
head(BreastCancer[, 1:10])
但是你被打印风格所误导了。这些列实际上是字符或因子:
lapply(BreastCancer[, 1:10], class)
当您使用
as.matrix
时,这些列都被强制转换为“character”类型(详见
R: Why am I not getting type or class "factor" after converting columns to factor?)。因此,在进行矩阵乘法时,我们需要将这些列正确地强制转换为“numeric”类型。
dat <- BreastCancer[, 1:10]
dat[[1]] <- as.numeric(dat[[1]])
dat[2:10] <- lapply( dat[2:10], function (x) as.numeric(levels(x))[x] )
X <- data.matrix(dat)
mode(X)
现在你可以进行矩阵与向量的乘法计算。
beta <- runif(10)
yhat <- X %*% beta
dat$prediction <- yhat
不过,我怀疑这不是在构建具有因子的模型时获取预测值的正确方法。因为模型矩阵不是上述的X
,而是虚拟矩阵。我强烈建议您使用predict
函数。
这行代码也对我起效了:as.matrix(sapply(dat, as.numeric))
看来你很幸运,数据集中因子水平与数值相同。一般来说,将因子转换为数字应该使用我所使用的方法。比较一下:
f <- gl(4, 2, labels = c(12.3, 0.5, 2.9, -11.1))
as.numeric(f)
as.numeric(levels(f))[f]
这个内容在文档页面?factor
中介绍。