主成分分析PCA(Principal Component Analysi)和冗余分析RDA(Redundancy analysis)都是数据分析的一种方法,都是在做降维处理,我遇到数据的时候该选择那种方法做呢?
将多维空间(多个原始测定指标)的数据点尽可能排列在可视化的低维空间。简单理解就是,测定的一种原始指标(比如株高)就是一个维度。假设,我为了了解某个物种的几个品种的生长情况,测了十几个跟生长相关的指标(株高、株幅等),然后我的目的是比较几个品种之间生长情况的相似性,是用株高来代表?还是用株幅来代表?还是用其他生长指标?我们都知道这十几个指标都需要,一起来代表才能说明生长情况,但十几个指标就相当于十几个维度,如何可视化,如何在图上展示(就我目前了解我们常用画出展示的最多就3维(XYZ)的图)?
办法就是:我们通过降维,用各种统计学手段,得到几个新的指标来代表这十几个指标,从十几个变成几个,就是降低了维度,就可以画可视化图形,让大家看明白了。其中一种统计学手段就叫----主成分分析,“几个新指标”指的就是“几个主成分”,但大家需要明确,做了主成分分析之后,实际得到的是与原始指标数量相等的主成分个数(但是,主成分≠测定指标),就是说,比如你有12个原始测定指标进行主成分分析,最后可得到的是12个主成分,你需要根据你自己的需求来选取你需要多少个主成分来近似地/尽最大限度地(因此,主成分分析不是统计检验,而是探索性分析方法)代表这12个指标的信息(就是说一旦你选取了前几个主成分,那就有部分信息损失,但不选就达不到降维的目的啊),以方便后续的可视化分析。结合R进行主成分分析后的结果表来说明一下,你就进一步明白了:

运行以下代码
student_scores=read.csv("student_scores.csv")#把原始数据导入R
pca_student = princomp(student_scores,cor = T)#计算PCA,cor=T表示用的是相关阵,而默认是协差阵
summary(pca_student,loadings = T)#显示结果,loading=T是列出主成分对应原始变量的系数
然后得到的结果如下:

1、以上这6个主成分(Comp.1-Comp.6)是互不相关的,它们每一个都不是X1-X6中任何一个,而是由所有原有6个指标数据进行线性组合而来,比如Comp.1=系数1*X1+系数2*X2+系数3*X3+系数4*X4+系数5*X5+系数6*X6。
2、6个主成分的贡献率大小反映的是它们综合原始指标(6门功课成绩X1-X6)的能力。我们常听说的特征值/特征根(eigen value)指的是某个主成分的方差,其相对比例可理解为方差解释度或贡献度 ,特征值从Comp.1到Comp.6会逐渐减小。这里结果给出的是主成分的标准差Standard deviation (方差=标准差的平方),所以想要得到特征值就再平方一下就ok。主成分1的贡献率Proportion of Variance最大(0.6638172),表明由主成分1的差异来解释X1-X6的差异的能力最强。6个主成分的累积贡献率Cumulative Proportion是1,就是说用6个主成分才能100%代表这6个指标所给出的总体信息;但其实前3个主成分的累积贡献率是0.9128916,已经超过了0.9,就是说可以解释超过90%的总体信息,所以可以考虑就选取前3个主成分来进行后续画图分析等。
3、loading里给出的是主成分对应原始变量的系数,应该是每个值都有,但有些值太小R运行后结果里就没有显示(比如Comp.2对应X1的系数),我暂时还没找到什么方法能把这些很小的值也都显示出来。从loading里可以看出各主成分与原始指标之间的相互关系,比如主成分1就与所有6科成绩间关系都很密切,主成分2与X2这个科目成绩之间关系较为密切(0.914比其他几个系数的绝对值都大很多),主成分3与X1这个科目成绩之间关系密切(0.883比其他几个系数的绝对值都大很多)。
通常有2种展示类型


上面废话那么多好像我只说了主成分分析,其实我把主成分分析和冗余分析的一些共性特点都说了,因为它们两者是有包含关系的。冗余分析是回归分析+主成分分析的排序方法(先将响应变量Y矩阵与解释变量X之间进行多元线性回归,再对得到的拟合值进行主成分分析)。
PCA属于非约束排序(只是描述性方法,不存在统计检验评估排序结果显著性的问题)
RDA属于约束排序(需要对排序结果进行显著性检验)。
1、前面提到主成分个数的选取,我们到底该选取几个主成分来代表整体呢,选取依据是什么?
2、R语言进行主成分分析,一些参数该如何设置呢?
3、进行主成分分析的函数有 princomp和prcomp、rda,选哪种呢?
4、冗余分析还包括了回归分析的相关计算,所以,冗余分析还需要进一步去解释。
1、https://zhuanlan.zhihu.com/p/180284720?utm_source=wechat_session&ivk_sa=1024320u
2、https://zhuanlan.zhihu.com/p/404795652
3、https://blog.csdn.net/lfz_carlos/article/details/48442091
4、https://cloud.tencent.com/developer/article/1635055
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R
我喜欢使用Textile或Markdown为我的项目编写自述文件,但是当我生成RDoc时,自述文件被解释为RDoc并且看起来非常糟糕。有没有办法让RDoc通过RedCloth或BlueCloth而不是它自己的格式化程序运行文件?它可以配置为自动检测文件后缀的格式吗?(例如README.textile通过RedCloth运行,但README.mdown通过BlueCloth运行) 最佳答案 使用YARD直接代替RDoc将允许您包含Textile或Markdown文件,只要它们的文件后缀是合理的。我经常使用类似于以下Rake任务的东西:
rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
我正在开发我的第一个Rubygem,并捆绑了cucumber、rspec和shoulda-matches进行测试。当我运行rspec时,出现以下错误:/app/my_gem/spec/spec_helper.rb:6:in`':undefinedmethod`configure'forShoulda::Matchers:Module(NoMethodError)这是我的gem规范:#my_gem.gemspec...Gem::Specification.newdo|spec|......spec.add_development_dependency"activemodel"spec.a
我正在使用Heroku(heroku.com)来部署我的Rails应用程序,并且正在构建一个iPhone客户端来与之交互。我的目的是将手机的唯一设备标识符作为HTTPheader传递给应用程序以进行身份验证。当我在本地测试时,我的header通过得很好,但在Heroku上它似乎去掉了我的自定义header。我用ruby脚本验证:url=URI.parse('http://#{myapp}.heroku.com/')#url=URI.parse('http://localhost:3000/')req=Net::HTTP::Post.new(url.path)#boguspara
require"socket"server="irc.rizon.net"port="6667"nick="RubyIRCBot"channel="#0x40"s=TCPSocket.open(server,port)s.print("USERTesting",0)s.print("NICK#{nick}",0)s.print("JOIN#{channel}",0)这个IRC机器人没有连接到IRC服务器,我做错了什么? 最佳答案 失败并显示此消息::irc.shakeababy.net461*USER:Notenoughparame
我有这个代码:context"Visitingtheusers#indexpage."dobefore(:each){visitusers_path}subject{page}pending('iii'){shouldhave_no_css('table#users')}pending{shouldhavecontent('Youhavereachedthispageduetoapermissionic错误')}它会导致几个待处理,例如ManagingUsersGivenapractitionerloggedin.Visitingtheusers#indexpage.#Noreason
下面的代码工作正常:person={:a=>:A,:b=>:B,:c=>:C}berson={:a=>:A1,:b=>:B1,:c=>:C1}kerson=person.merge(berson)do|key,oldv,newv|ifkey==:aoldvelsifkey==:bnewvelsekeyendendputskerson.inspect但是如果我在“ifblock”中添加return,我会得到一个错误:person={:a=>:A,:b=>:B,:c=>:C}berson={:a=>:A1,:b=>:B1,:c=>:C1}kerson=person.merge(berson
我正在为我的用户实现一些rubyonrails代码推特内容。我正在创建正确的oauth链接...类似http://twitter.com/oauth/authorize?oauth_token=y2RkuftYAEkbEuIF7zKMuzWN30O2XxM8U9j0egtzKv但在我的测试帐户授予对twitter的访问权限后,它会弹出一个页面,上面写着“您已成功授予对.我不知道用户应该在哪里输入此PIN以及他们为什么必须这样做。我认为这不是必要的步骤。Twitter应该将用户重定向到我在应用程序设置中提供的回调URL。有谁知道为什么会这样?更新我找到了thisarticle声明我需