test/test_factor.rb in statsample-0.18.0 vs test/test_factor.rb in statsample-1.0.0
- old
+ new
@@ -33,21 +33,22 @@
}
end
def test_principalcomponents_ruby_gsl
- ran=Distribution::Normal.rng_ugaussian
+ ran=Distribution::Normal.rng
# @r=::Rserve::Connection.new
samples=20
- (3..7).each {|k|
+ [3,5,7].each {|k|
v={}
v["x0"]=samples.times.map { ran.call()}.to_scale.centered
(1...k).each {|i|
v["x#{i}"]=samples.times.map {|ii| ran.call()*0.5+v["x#{i-1}"][ii]*0.5}.to_scale.centered
}
+
ds=v.to_dataset
cm=ds.covariance_matrix
# @r.assign('ds',ds)
# @r.eval('cm<-cor(ds);sm<-eigen(cm, sym=TRUE);v<-sm$vectors')
# puts "eigenvalues"
@@ -80,11 +81,11 @@
principalcomponents(true)
principalcomponents(false)
end
def principalcomponents(gsl)
- ran=Distribution::Normal.rng_ugaussian
+ ran=Distribution::Normal.rng
samples=50
x1=samples.times.map { ran.call()}.to_scale
x2=samples.times.map {|i| ran.call()*0.5+x1[i]*0.5}.to_scale
ds={'x1'=>x1,'x2'=>x2}.to_dataset
@@ -92,14 +93,15 @@
r=cm[0,1]
pca=Statsample::Factor::PCA.new(cm,:m=>2,:use_gsl=>gsl)
assert_in_delta(1+r,pca.eigenvalues[0],1e-10)
assert_in_delta(1-r,pca.eigenvalues[1],1e-10)
hs=1.0 / Math.sqrt(2)
- assert_equal_matrix(hs*Matrix[[1],[1]],pca.eigenvectors[0])
- m_1=gsl ? Matrix[[-1],[1]] : Matrix[[1],[-1]]
- assert_equal_matrix(hs*m_1, pca.eigenvectors[1])
+ assert_equal_vector(Vector[1, 1]*hs, pca.eigenvectors[0])
+ m_1=gsl ? Vector[-1,1] : Vector[1,-1]
+ assert_equal_vector(hs*m_1, pca.eigenvectors[1])
+
pcs=pca.principal_components(ds)
exp_pc_1=ds.collect_with_index {|row,i|
hs*(row['x1']+row['x2'])
}
exp_pc_2=ds.collect_with_index {|row,i|
@@ -131,72 +133,9 @@
m=harman_817
expected=[0.73,0.76,0.84,0.87,0.53,0.93,0.78,0.86]
m.row_size.times.map {|i|
assert_in_delta(expected[i], Statsample::Factor.kmo_univariate(m,i),0.01)
}
- end
- def test_parallelanalysis_with_data
- if Statsample.has_gsl?
- samples=100
- variables=10
- iterations=50
- rng = Distribution::Normal.rng_ugaussian
- f1=samples.times.collect {rng.call}.to_scale
- f2=samples.times.collect {rng.call}.to_scale
- vectors={}
- variables.times do |i|
- if i<5
- vectors["v#{i}"]=samples.times.collect {|nv|
- f1[nv]*5+f2[nv]*2+rng.call
- }.to_scale
- else
- vectors["v#{i}"]=samples.times.collect {|nv|
- f2[nv]*5+f1[nv]*2+rng.call
- }.to_scale
- end
-
- end
- ds=vectors.to_dataset
-
- pa1=Statsample::Factor::ParallelAnalysis.new(ds, :bootstrap_method=>:data, :iterations=>iterations)
- pa2=Statsample::Factor::ParallelAnalysis.with_random_data(samples,variables,:iterations=>iterations,:percentil=>95)
- 3.times do |n|
- var="ev_0000#{n+1}"
- assert_in_delta(pa1.ds_eigenvalues[var].mean,pa2.ds_eigenvalues[var].mean,0.04)
- end
- else
- skip("Too slow without GSL")
- end
-
- end
- def test_parallelanalysis
- pa=Statsample::Factor::ParallelAnalysis.with_random_data(305,8,:iterations=>100,:percentil=>95)
- assert_in_delta(1.2454, pa.ds_eigenvalues['ev_00001'].mean, 0.01)
- assert_in_delta(1.1542, pa.ds_eigenvalues['ev_00002'].mean, 0.01)
- assert_in_delta(1.0836, pa.ds_eigenvalues['ev_00003'].mean, 0.01)
- #puts pa.summary
- assert(pa.summary.size>0)
- #pa=Statsample::Factor::ParallelAnalysis.with_random_data(305,8,100, 95, true)
- #puts pa.summary
- end
- def test_map
- #fields=%w{height arm.span forearm lower.leg weight bitro.diameter chest.girth chest.width}
- m=Matrix[
- [ 1, 0.846, 0.805, 0.859, 0.473, 0.398, 0.301, 0.382],
- [ 0.846, 1, 0.881, 0.826, 0.376, 0.326, 0.277, 0.415],
- [ 0.805, 0.881, 1, 0.801, 0.38, 0.319, 0.237, 0.345],
- [ 0.859, 0.826, 0.801, 1, 0.436, 0.329, 0.327, 0.365],
- [ 0.473, 0.376, 0.38, 0.436, 1, 0.762, 0.73, 0.629],
- [ 0.398, 0.326, 0.319, 0.329, 0.762, 1, 0.583, 0.577],
- [ 0.301, 0.277, 0.237, 0.327, 0.73, 0.583, 1, 0.539],
- [ 0.382, 0.415, 0.345, 0.365, 0.629, 0.577, 0.539, 1]
- ]
- map=Statsample::Factor::MAP.new(m)
- assert_in_delta(map.minfm, 0.066445,0.00001)
- assert_equal(map.number_of_factors, 2)
- assert_in_delta(map.fm[0], 0.312475,0.00001)
- assert_in_delta(map.fm[1], 0.245121,0.00001)
-
end
# Tested with SPSS and R
def test_pca
a=[2.5, 0.5, 2.2, 1.9, 3.1, 2.3, 2.0, 1.0, 1.5, 1.1].to_scale
b=[2.4, 0.7, 2.9, 2.2, 3.0, 2.7, 1.6, 1.1, 1.6, 0.9].to_scale