在矩阵数据上使用lm和预测

5

我仅略懂R,从未使用过数据框架(Data Frames),这使得理解正确的predict使用方法变得困难。我的数据是以简单的矩阵形式呈现,并非数据框架,称之为ab,分别为N x pM x p矩阵。我可以运行回归lm(a[,1] ~ a[,-1])。我想使用生成的lm对象预测b[,1]来自于b[,-1]。我天真猜测使用predict(lm(a[,1] ~ a[,-1]), b[,-1])无法奏效。请问使用lm获取预测向量的正确语法是什么?


在你的问题中,“不起作用”是什么意思?为什么不直接使用data.frame呢? - Paul Hiemstra
@PaulHiemstra 因为我不知道如何使用 data.frame。这就是问题所在。我尝试了几个可行的选项将我的内容转换为数据框,但似乎都不起作用。我相信答案非常简单,只是猜测语法让我感到沮丧。 - pythonic metaphor
请确保您的示例可复现。 - Paul Hiemstra
3
你尝试使用 a <- as.data.frame(a) 将对象转换为数据框。 - Simon O'Hanlon
4个回答

7

您可以将整个矩阵存储在data.frame的一列中:

x <- a [, -1]
y <- a [,  1]
data <- data.frame (y = y, x = I (x))
str (data)
## 'data.frame':    10 obs. of  2 variables:
## $ y: num  0.818 0.767 -0.666 0.788 -0.489 ...
## $ x: AsIs [1:10, 1:9] 0.916274.... 0.386565.... 0.703230.... -2.64091.... 0.274617.... ...

model <- lm (y ~ x)
newdata <- data.frame (x = I (b [, -1]))
predict (model, newdata) 
##         1         2 
## -3.795722 -4.778784 

这篇关于pls包的论文(Mevik, B.-H. 和 Wehrens, R. The pls Package: Principal Component and Partial Least Squares Regression in R Journal of Statistical Software, 2007, 18, 1 - 24.)解释了这个技术。

我的包hyperSpec中的vignette ("flu")给出了一个荧光奎宁光谱数据集的示例。


2

要将矩阵制成 data.frame,只需执行以下操作:

m = matrix(runif(100), 10, 10)
df = as.data.frame(m)

并进行线性回归:

lm_result = lm(V1 ~ V100, df)
predicted_values = predict(lm_result, b)

或者对于多元回归:

lm_result = lm(V1 ~ V2 + V3 + V4, df)
predicted_values = predict(lm_result, b)

假设列 V1 - V4 存在于 b 中。

谢谢。当p(预测变量的数量)未知时,仍然有些棘手。 - NPE
或者相当大。我有很多预测器。我需要指定每一个吗? - pythonic metaphor
3
你可以即时创建公式,例如 as.formula(sprintf("V1 ~ %s", paste(names(df)[2:4], collapse = " + "))) - Paul Hiemstra
1
但是如果使用数百个预测变量进行线性回归,结果可能会有很多噪音。 - Paul Hiemstra
@PaulHiemstra 不是数百个,可能只有10个。但是 V2+v3+.. 看起来有点笨重。 - pythonic metaphor
显示剩余2条评论

1
你可以手动计算预测值:
> fit <- lm(a[,1] ~ a[,-1])
> fit$coefficients[1] + b[,-1] %*% fit$coefficients[-1]
     [,1]
[1,]    1
[2,]    2
[3,]    5

这里的fit$coefficients[1]是截距,而fit$coefficients[-1]是剩余系数(%*%表示矩阵乘法)。

这是我以前使用过的方法,但我想尝试使用一些预测函数的特性。它非常简单易用。 - pythonic metaphor
这很快,但代价是没有predict的花哨功能(置信区间、预测区间)。 - cbeleites unhappy with SX

0

我正在函数内部使用lm来遍历许多不同的线性模型,然后执行留一交叉验证以进行预测。@PaulHiemstra 的sprintf解决了问题。


1
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接