- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用PCA选择好的预测变量,以在xreg
模型的arima
参数中使用,以尝试预测下面的tVar
变量。我仅使用下面的简化数据集,其中仅包含几个变量以简化示例。
我试图了解princomp
中的公式参数如何工作。对于下面的pc
对象,是否表示“使用xVar1
和xVar2
解释na.omit(dfData[,c("tVar","xVar1","xVar2")])
中的差异”?
我最终想要做的是创建一个新变量,该变量解释tVar
中的大部分差异。使用PCA可以做到吗?如果是这样,有人可以解释一下还是将我引向一个例子?
码:
pc <- princomp(~xVar1+xVar2,
data = na.omit(dfData[,c("tVar","xVar1","xVar2")]),
cor=TRUE)
dput(na.omit(dfData[1:100,c("tVar","xVar1","xVar2")]))
structure(list(tVar = c(11, 14, 17, 5, 5, 5.5, 8, 5.5,
6.5, 8.5, 4, 5, 9, 10, 11, 7, 6, 7, 7, 5, 6, 9, 9, 6.5, 9, 3.5,
2, 15, 2.5, 17, 5, 5.5, 7, 6, 3.5, 6, 9.5, 5, 7, 4, 5, 4, 9.5,
3.5, 5, 4, 4, 9, 4.5, 6, 10, 9.5, 15, 9, 5.5, 7.5, 12, 17.5,
19, 7, 14, 17, 3.5, 6, 15, 11, 10.5, 11, 13, 9.5, 9, 7, 4, 6,
15, 5, 18, 5, 6, 19, 19, 6, 7, 7.5, 7.5, 7, 6.5, 9, 10, 5.5,
5, 7.5, 5, 4, 10, 7, 5, 12), xVar1 = c(0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L,
1L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L),
xVar2 = c(0L,
1L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 0L, 1L, 1L, 0L,
2L, 3L, 0L, 0L, 1L, 0L, 0L, 1L, 1L, 0L, 1L, 0L, 0L, 0L, 1L, 0L,
0L, 1L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 0L, 1L, 0L, 0L,
0L, 0L, 0L, 0L, 1L, 0L, 1L, 1L, 0L, 0L, 0L, 3L, 1L, 0L, 1L, 2L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 0L,
1L, 1L, 0L, 0L, 1L, 0L, 1L, 1L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 1L,
0L)), .Names = c("tVar", "xVar1", "xVar2"
), row.names = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 9L, 10L, 11L, 12L,
13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L,25L,
26L, 27L, 28L, 29L, 30L, 31L, 32L, 33L, 34L, 35L, 36L, 37L,38L,
39L, 40L, 41L, 42L, 43L, 44L, 45L, 46L, 47L, 48L, 49L, 50L,51L,
52L, 54L, 55L, 56L, 57L, 58L, 59L, 60L, 61L, 62L, 63L, 64L, 65L,
66L, 67L, 68L, 69L, 70L, 71L, 72L, 73L, 74L, 75L, 76L, 77L, 78L,
79L, 80L, 81L, 82L, 83L, 84L, 85L, 86L, 87L, 88L, 89L, 90L, 91L,
92L, 93L, 94L, 95L, 96L, 97L, 98L, 99L, 100L),
class = "data.frame", na.action = structure(c(8L,53L),
.Names = c("8", "53"), class = "omit"))
最佳答案
(这是一篇非常好的文章!今天有关于PCA的另一篇文章很有趣。尽管这个问题更基本,但关于the difference between princomp
and prcomp
,但是我在the answer中使用R代码编写的数学细节可能对任何人都有益学习PCA。)
在以下情况下,将PCA用于缩小尺寸(低阶近似):
您有很多(例如p
)相关变量x1, x2, ..., xp
;
您希望将它们缩小为少量(例如k < p
)新的线性独立变量z1, z2, ..., zk
;
您想使用z1, z2, ..., zk
而不是x1, x2, ..., xp
来预测响应变量y
。
基本情况和一些数学
假设您有一个响应变量y
,不删除任何变量的全线性回归应采用以下公式:
y ~ x1 + x2 + ... + xp
X
为上面的模型矩阵,即通过按列组合所有
x1, x2, ... , xp
观察值的矩阵,然后
S <- cor(X) ## get correlation matrix S
E <- eigen(S) ## compute eigen decomposition of S
root_eigen_value <- sqrt(E$values) ## square root of eigen values
eigen_vector_mat <- E$vectors ## matrix of eigen vectors
X1 <- scale(X) %*% eigen_vector_mat ## transform original matrix
root_eigen_value
(长度-
p
向量)单调递减,即对总协方差的贡献正在递减,因此我们只能选择第一个
k
值。因此,我们可以选择转换后的矩阵
k
的前
X1
列。让我们做:
Z <- X1[, 1:k]
p
变量简化为
k
变量,并且
Z
的每一列都是新变量
z1, z2, ..., zk
。请记住,这些变量不是原始变量的子集。他们是全新的,没有名字。但是,由于我们仅对预测
y
感兴趣,因此给
z1, z2, ..., zk
命名是无关紧要的。然后我们可以拟合一个近似线性模型:
y ~ z1 + z2 + ... + zk
princomp()
princomp()
为我们完成了所有计算。通过致电:
pc <- princomp(~ x1 + x2 + ... + xp, data, cor = TRUE)
pc
的一些返回值中:
pc$sdev
给出
root_eigen_value
。如果执行
plot(pc)
,则可以看到显示此内容的条形图。如果您的输入数据高度相关,那么您期望在该图中看到接近指数的衰减,只有少数变量支配协方差。 (不幸的是,您的玩具数据不起作用。
xVar1
和
xVar2
是二进制的,并且它们已经线性独立,因此在PCA之后,您将看到它们都发挥了相同的作用。)
pc$loadings
给出
eigen_vector_mat
;
pc$scores
给出
X1
。
arima()
k
从总共
p
个变量中取出第一个
plot(pc)
变量,则可以提取
k
矩阵的第一个
pc$scores
列。每列构成
z1, z2, ..., zk
,然后通过参数
arima()
将它们传递给
reg
。
tVar
与PCA步骤中使用的预测变量
xVar1
,
xVars
,...混合使用。
princomp()
允许三种方式传递参数:
princomp()
从
data
提取数据,随后将计算模型矩阵,协方差矩阵,相关矩阵,特征分解,直到最终获得PCA的结果。
tVar
。但是我想知道为什么
princomp(~xVar1+xVar2, data = na.omit(dfData[,c("tVar","xVar1","xVar2")]), cor=TRUE)
和
princomp(na.omit(dfData[,c("xVar1","xVar2")]), cor=TRUE)
基本相等?
~ xVar1 + xVar2
,因此是否在数据框中包含要传递给princomp的
tVars
都没有区别,因为
princomp
不会触及该列。
tVars
。就像我说的那样,回归和PCA是不同的问题,不应相互混淆。
xVar1
和
xVar2
的组合,并解释了
tVar
中的大部分差异,而是创建了一个新变量,该变量是
xVar1
和
xVar2
并解释了大多数
dfData[,c("xVar1","xVar2")]
的差异?
arima()
)用于设置响应
tVars
和预测变量
x1, x2, ..., xp
或
z1, z2, ..., zk
之间的关系。回归/主题模型将根据预测变量解释响应的均值和方差。
xVar1, xVar2, ...
的低秩(较少参数)表示形式,因此您可以在以后的回归/ ARIMA建模中使用较少的变量。
xVar1
和
xVar2
只是线性独立的,因此无法减小尺寸。您可以按
pairs(mydata)
查看数据中的相关性。更好的可视化可能是使用
corrplot
R包。有关如何使用它绘制协方差矩阵的示例,请参见
this answer。
关于r - PCA:princomp()如何工作,我可以用它为ARIMA提取变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37338278/
我正在从 Stata 迁移到 R(plm 包),以便进行面板模型计量经济学。在 Stata 中,面板模型(例如随机效应)通常报告组内、组间和整体 R 平方。 I have found plm 随机效应
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 6年前关闭。 Improve this qu
我想要求用户输入整数值列表。用户可以输入单个值或一组多个值,如 1 2 3(spcae 或逗号分隔)然后使用输入的数据进行进一步计算。 我正在使用下面的代码 EXP <- as.integer(rea
当 R 使用分类变量执行回归时,它实际上是虚拟编码。也就是说,省略了一个级别作为基础或引用,并且回归公式包括所有其他级别的虚拟变量。但是,R 选择了哪一个作为引用,以及我如何影响这个选择? 具有四个级
这个问题基本上是我之前问过的问题的延伸:How to only print (adjusted) R-squared of regression model? 我想建立一个线性回归模型来预测具有 15
我在一台安装了多个软件包的 Linux 计算机上安装了 R。现在我正在另一台 Linux 计算机上设置 R。从他们的存储库安装 R 很容易,但我将不得不使用 安装许多包 install.package
我正在阅读 Hadley 的高级 R 编程,当它讨论字符的内存大小时,它说: R has a global string pool. This means that each unique strin
我们可以将 Shiny 代码写在两个单独的文件中,"ui.R"和 "server.R" , 或者我们可以将两个模块写入一个文件 "app.R"并调用函数shinyApp() 这两种方法中的任何一种在性
我正在使用 R 通过 RGP 包进行遗传编程。环境创造了解决问题的功能。我想将这些函数保存在它们自己的 .R 源文件中。我这辈子都想不通怎么办。我尝试过的一种方法是: bf_str = print(b
假设我创建了一个函数“function.r”,在编辑该函数后我必须通过 source('function.r') 重新加载到我的全局环境中。无论如何,每次我进行编辑时,我是否可以避免将其重新加载到我的
例如,test.R 是一个单行文件: $ cat test.R # print('Hello, world!') 我们可以通过Rscript test.R 或R CMD BATCH test.R 来
我知道我可以使用 Rmd 来构建包插图,但想知道是否可以更具体地使用 R Notebooks 来制作包插图。如果是这样,我需要将 R Notebooks 编写为包小插图有什么不同吗?我正在使用最新版本
我正在考虑使用 R 包的共享库进行 R 的站点安装。 多台计算机将访问该库,以便每个人共享相同的设置。 问题是我注意到有时您无法更新包,因为另一个 R 实例正在锁定库。我不能要求每个人都关闭它的 R
我知道如何从命令行启动 R 并执行表达式(例如, R -e 'print("hello")' )或从文件中获取输入(例如, R -f filename.r )。但是,在这两种情况下,R 都会运行文件中
我正在尝试使我当前的项目可重现,因此我正在创建一个主文档(最终是一个 .rmd 文件),用于调用和执行其他几个文档。这样我自己和其他调查员只需要打开和运行一个文件。 当前设置分为三层:主文件、2 个读
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 5年前关闭。 Improve this qu
我的 R 包中有以下描述文件 Package: blah Title: What the Package Does (one line, title case) Version: 0.0.0.9000
有没有办法更有效地编写以下语句?accel 是一个数据框。 accel[[2]]<- accel[[2]]-weighted.mean(accel[[2]]) accel[[3]]<- accel[[
例如,在尝试安装 R 包时 curl作为 usethis 的依赖项: * installing *source* package ‘curl’ ... ** package ‘curl’ succes
我想将一些软件作为一个包共享,但我的一些脚本似乎并不能很自然地作为函数运行。例如,考虑以下代码块,其中“raw.df”是一个包含离散和连续类型变量的数据框。函数“count.unique”和“squa
我是一名优秀的程序员,十分优秀!