SPSS+AMOS数据分析案例教程-关于中介模
SPSS视频教程内容目录和跳转链接
Mplus中介和调节教程
大学生问卷互填群
Meta分析辅导+代找数据
SPSS+AMOS数据分析案例教程-关于中介模
SPSS视频教程内容目录和跳转链接
R语言快速入门视频教程
LCA潜在类别分析和Mplus应用
Amos结构方程模型数据分析入门教程
倒U关系回归分析中介效应和调节效应分析SPSS视频教程
统计咨询(图文问答)

psychopy教程2-builder概念介绍

概述

Builder视图中两个最重要的概念就是Routines和Flow, 从英语的语义来说,Routines就是一些常用的环节,而在心理学实验中,刺激和反应是心理学家最关注的两个环节,所以psychopy中的环节也可以按照刺激和反应来分类。Flow的语义就是流程,他控制的就是Routines。每个实验程序只能有一个Flow但是可以有很多Routines。另外一个比Routines更小的单元叫做组件,组件组成Routine的各个零件,比如一个指导语页面包含至少两个组件,一个是文本组件一个是键盘反应组件,文本组件用于呈现指导语,键盘反应组件用于控制被试的键盘动作,这些概念后面还会介绍,不用深究。所以最后强调一点,多个组件构成一个Routine,而多个Routines形成一个FLow。

Read More

psychopy教程1-入门认识psychopy

本篇文章开始正式进入psychopy的教程,先给大家介绍一下psychopy软件的两个基本视图,然后在不同的视图下实现同一个程序。如果你还没有安装psychopy,在这里可以下载和安装。

两种视图

Psychopy本质上是一个桌面软件,有两个视图:Builder视图和Coder视图,顾名思义,Builder视图基于一个友好的用户界面,用户不需要专业的编程知识,只需要鼠标点击和拖拽就能完成一个简单的实验程序;Coder视图只提供了一个代码编辑器,你需要编写代码来完成一个实验程序。两个视图各有优劣,因为我是开发软件的,所以我个人的建议是从一开始就使用Coder编写你的实验程序,一方面,编程能力是这个时代对每个人的基本要求,另一方面,Coder的工作效率非常高,尤其是当你需要经常编写实验程序的时候。如果你有编程经验,学习使用Builder和Coder的时间成本几乎是一样的。但是,如果你并没用编程经验,并且以后没有计划再次使用psychopy,Builder也许是你唯一的选择。

Read More

EPrime中如使何呈现时间随机

问题:EPrime中如使何呈现时间随机

问题内容

想使trial之间插入的空屏的呈现时间在一定范围内随机,请问该如何实现?
*就是一个trial结束之后随机空屏500-1000ms
*之前在别的回答里看到有说用list实现…现在的实验设计已经是两层嵌套了,感觉再用list就= =…虽然也可以啦就是有点复杂…

谢谢回答诶~

Read More

selenium进阶教程

本篇文章主要介绍一下python-selenium在进行自动化功能测试的时候经常用到的一些高级API,这些API的灵活运用可以提高测试脚本的质量和性能。

回顾初级教程

如果没有接触过python-selenium,恐怕你需要先浏览一下这篇文章:selenium数据采集入门(for psychologist)

Read More

psychopy中文版安装(附下载地址)

简介

psychopy是著名的心理学刺激呈现软件,类似eprime,但是因为加持python,所以远比eprime强大,而且psychopy和eprime类似,有适合非专业人士的图形界面,也有适合程序员的coder模式,更有对openGL的支持。

软件特点

具体来说它有如下特点:

  • 安装简单
  • 精准的时间控制
  • 丰富的刺激类型
    • 文字
    • 图片
    • 视频
    • 点、线、图形
    • 声音
    • 几乎任何你想到的刺激
  • 跨平台,linux、windows、mac都支持
  • coder和builder模式,支持图形界面和编程
  • 多显示器呈现刺激
  • 支持多种通讯接口,支持各种脑电和眼动设备

软件下载链接/地址

MAC和WINDOWS版下载: http://pan.baidu.com/s/1o7JHtcY 密码:9d5e

软件安装过程

其实软件安装非常简单,只要一路next即可,所以,我这里只贴下截图,有问题在下面留言。

实验程序开发

如果你的实验程序非常复杂,需要帮助,可以联系我的QQ675495787,或者访问店铺

gitlab和git入门

安装 git for windows

下载链接:http://pan.baidu.com/s/1b1hNtG 密码:pe3y。

安装很简单,不详细介绍。

初始设置

1
2
git config --global user.name "gitlab网站的用户名"
git config --global user.email "注册的邮箱"

复制代码

从gitlab克隆一个项目:

http://gitlab.eachina.com:10080/ydsun/functional-test.git

1
git clone http://gitlab.eachina.com:10080/ydsun/functional-test.git

修改代码

可以新建、删除、修改文件。

保存修改

你修改的代码只是保存在工作区,并没有进入版本仓库中,
你需要使用如下命令保存修改。

1
2
git add .
git commit -m "增加登录测试"

推送修改

只有推动到gitlab网站,才能使得别人看到你做的修改。但是在推送之前,需要保证你已经拿到了最新的代码,所以按照以下步骤进行推送:

先更新代码,也就是从gitlab服务器中下载最新版本:

1
git pull origin master

然后再推送你的修改

1
git push origin master

python-selenium撰写自动化功能测试脚本

安装

你需要参考selenium入门
来指导你安装python和selenium,
同时你还需要安装chrome和chromedriver,在这篇文章中有详细的介绍。

撰写用例

在写功能测试脚本之前,需要先指导测什么。这就是用例的作用。用例要详细描述一个用户的操作行为,用到的数据,得到的反馈等。
比如我们想要测试网站的登录功能,我们可以这么写:

打开网址http://www.mlln.cn
点击登录按钮
输入用户名和密码
点击登录
验证登录是否成功

用例要列出所有可能的反馈,测试也要测试到所有可能情况。比如简单的登录功能,首先要测试成功登录的情况,然后要测试用户名或密码错误的情况。
网站应当根据不同的用户操作给出不同的反馈。

编写脚本

脚本就是一段代码,用于执行一个特定的功能。通常一个*.py文件存放一个脚本,一个测试脚本的大体结构应当是这样的:

文件中最上面写用例, 用三个引号表示。比如'''这是一个测试用例的描述文字 '''
准备阶段:准备好测试用到的数据,比如你要测试的是登录功能,你需要提前写入数据一个账号和密码,用于测试,写入数据的过程就是准备过程
测试阶段:写代码执行测试
销毁阶段:在准备阶段写入的数据应当在销毁阶段销毁,也就是删除测试账号。关闭任何打开过的浏览器或其他软件。

测试脚本文件名称以test_开头。

下面是一个测试脚本的样例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
'''
这里描述测试用例
'''
import settings
import selenium


def prepare():
'''准备阶段'''
pass


def test():
'''测试阶段'''
pass


def destroy():
'''销毁阶段'''
pass

svd和pca的区别和联系,附代码实现

svd=singular value decomposition
pca=principal component analysis

在做潜在语义分析(lsa)的时候,我用的svd,感觉svd和pca非常像,但是又有区别。所以查了一些资料,在这里翻译一下,并在最后,贴上python代码比较了这两种方法。

PCA

假设\( \mathbf X \)是一个\( n \times p \)的矩阵,n是样本量, 而p是变量个数。那么,我们就可以计算得到协方差矩阵\( \Singma \)

\[ \Sigma=X^TX/(n-1) \]

由于\( \Sigma \)是对称矩阵,那么它可以对角化:

\[ \Sigma = \mathbf V \mathbf L \mathbf V^\top \]

\( \mathbf V \)就是\( \mathbf X \)的特征向量构成的矩阵,而\( \mathbf L \)是一个对角矩阵,对角元素就是特征向量对应的特征值。

\( \mathbf Y \)表示主成分矩阵,\( y_i \)表示第i个主成分向量。用\( v_i \)表示第i个特征向量。那么有关系式:

\[ y_i= \mathbf X v_i\]

即:

\[ Y= \mathbf X \mathbf V \]

SVD

接下来我们看看SVD的性质。对\( \mathbf X \)进行SVD分解:

\[ \mathbf X = \mathbf U \mathbf S \mathbf V^\top \]

\( \mathbf V \)和上面提到的\( \mathbf V \)是一样的,但是在SVD中叫做singular vector(奇异向量),而\( \mathbf S \)叫做奇异值构成的对角矩阵, 它与特征向量是不同的,但是他们之间是成比例的。如此,我们很容易得到:

\[ \mathbf X = \mathbf V \mathbf S \mathbf U^\top \mathbf U \mathbf S \mathbf V^\top /(n-1) = \mathbf V \frac{\mathbf S^2}{n-1}\mathbf V^\top \]

所以,特征值与奇异值之间的关系就是:

\[ \lambda_i = s_i^2/(n-1) \]

主成分也可以得到:

\[ \mathbf X \mathbf V = \mathbf U \mathbf S \mathbf V^\top \mathbf V = \mathbf U \mathbf S \]

下面我们通过python代码来探索svd和pca之间的关系

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import numpy as np
from numpy import linalg as la
np.random.seed(42)


def flip_signs(A, B):
"""
utility function for resolving the sign ambiguity in SVD
http://stats.stackexchange.com/q/34396/115202
"""
signs = np.sign(A) * np.sign(B)
return A, B * signs


# Let the data matrix X be of n x p size,
# where n is the number of samples and p is the number of variables
n, p = 5, 3
X = np.random.rand(n, p)
# Let us assume that it is centered
X -= np.mean(X, axis=0)

# the p x p covariance matrix
C = np.cov(X, rowvar=False)
print ("C = \n", C)
# C is a symmetric matrix and so it can be diagonalized:
l, principal_axes = la.eig(C)
# sort results wrt. eigenvalues
idx = l.argsort()[::-1]
l, principal_axes = l[idx], principal_axes[:, idx]
# the eigenvalues in decreasing order
print ("l = \n", l)
# a matrix of eigenvectors (each column is an eigenvector)
print ("V = \n", principal_axes)
# projections of X on the principal axes are called principal components
principal_components = X.dot(principal_axes)
print ("Y = \n", principal_components)

# we now perform singular value decomposition of X
# "economy size" (or "thin") SVD
U, s, Vt = la.svd(X, full_matrices=False)
V = Vt.T
S = np.diag(s)
print ("V2 = \n", V )
# 1) then columns of V are principal directions/axes.
assert np.allclose(*flip_signs(V, principal_axes))

# 2) columns of US are principal components
assert np.allclose(*flip_signs(U.dot(S), principal_components))

# 3) singular values are related to the eigenvalues of covariance matrix
assert np.allclose((s ** 2) / (n - 1), l)

# 8) dimensionality reduction
k = 2
PC_k = principal_components[:, 0:k]
US_k = U[:, 0:k].dot(S[0:k, 0:k])
assert np.allclose(*flip_signs(PC_k, US_k))

# 10) we used "economy size" (or "thin") SVD
assert U.shape == (n, p)
assert S.shape == (p, p)
assert V.shape == (p, p)

gitlab配置和基本使用方法(写给测试用)

注册账号

打开gitlab,注册一个账户。

记住账号,并把账号发送给管理员,让管理员给你设置权限。

打开网址查看项目http://123.56.79.214:10080/ydsun/auto_report_client,如果你看不到,说明你还没有权限。

下载代码

在项目主页,找到下载按钮,下载源码。下载得到一个zip压缩包,把压缩包解压到你想要放置源码的地方。

安装

打开项目主页,在主页上可以看安装的过程。

报告文字模板书写规范培训

注意,文章中所有 { { } } { % % } 中间没有空格

变量

{ { } }来修饰变量,内部的值会被渲染成文本。比如 我有{ { 1 + 1 } }个苹果会被渲染成 我有2个苹果

通常我们会提前设置好一些变量,比如,我们在写模板的时候,为了方便起见,可以先设pro_code=44,即广东省的省代码,这些变量的设置可以在word的常量表里。那么我们在需要用到省代码的地方,可以写成{ { pro_code } },如此便能在不同的省报告中使用不同的省代码了。

计算

我们除了可以设置一些常量(如pro_code)之外,我们还可以计算一些临时变量。比如a = 500*600 ,这样,我们就得到一个变量2,他的值为500和600的乘积。除此以外,我们更常用的是如下这种形式的计算:

1
a2=V("maths_level")|table("4stu")|select({"province":pro_code})|which(2)|percent|format({"decimal":1,"multi":100})

我们分别来说一下其中用到的一些方法。

Variable 和 table

表示变量的符号。上面的例子中,等号后面的式子,开头一个V表示variable,这是为了识别数据库中的变量。后面的参数就是变量名。Variabel 后面的 table 指明变量来自于哪一个表。为了方便起见,这两种写法是等价的:

1
V("maths_level")|table("4stu") <==> V("maths_level", "4stu")

select

select是对数据的选择。上面的例子指明了我们的数据限定在一个省。如果要计算全国数据,直接去掉select及其参数即可。如果需要使用多个筛选条件,比如要选择广东省的男生数据,那么可以用逗号隔开两个条件,写成如下形式:(province 和 gender都是数据库中的变量,他们都需要用引号包裹起来)

1
select({"province":pro_code, "gender":1})

which

which只有在计算百分比的时候有用,因为他指的是计算谁的百分比。上例中计算的是maths_level为2的百分比。

percent & mean

这两个函数都是指明计算方法,顾名思义,前者计算百分比,后者计算平均值。

format

顾名思义,format是用来描述数据格式的。参数decimal表明小数位数,multi表明乘数,按照上例来说,percent方法的计算结果都在(0,1)之间,所以我们让结果乘以100,保留1位小数, 另外再加上一个百分号。写法就是:(decimal、multi和suffix的前后顺序不影响结果)

1
format({"decimal":1,"multi":100,"suffix":"%"})

其实你可以省略format,这时候系统会使用默认的配置,保留一位小数。百分比的结果会乘以100以后再保留一位小数。

有一个问题需要指出,就是你在计算一个变量的时候,什么时候保留小数位数你得自己设置。例如,如下两种写法是不同的:

第一种写法:先保留一位小数,再相加

1
2
3
a2=V("maths_level")|table("4stu")|select({"province":pro_code})|which(2)|percent|format({"decimal":1,"multi":100})
a3=V("maths_level")|table("4stu")|select({"province":pro_code})|which(3)|percent|format({"decimal":1,"multi":100})
aa=a2+a3

第二种写法:先相加再保留1位小数

1
2
3
a2=V("maths_level")|table("4stu")|select({"province":pro_code})|which(2)|percent
a3=V("maths_level")|table("4stu")|select({"province":pro_code})|which(3)|percent
aa= (a2+a3)|format({"decimal":1,"multi":100})

groupby

groupby是将数据分组,分组后再计算,这样每个组都会得到一个结果。比如:

1
V("maths","4stu")|groupby("gender")|mean

这是计算两种性别下maths的平均值。

mi & ma

经常配合groupby使用,求最小值和最大值。因为groupby可以计算得到多个值,在多个值里面选择最大值和最小值就用mami

1
V("maths","4stu")|groupby("gender")|mean|mi

逻辑判断

逻辑判断语句的基本写法是:

1
2
3
4
5
6
7
{ % if a==b % }
a等于b
{ % elif a>b % }
a比b大{ { a - b } }
{ % else % }
a比b小{ { b-a } }
{ % end % }

注意,逻辑判断语句用到的符号是{ % ... % }。其中 if 和 end 标明语句的开始和结尾,中间可以用elif增加判断语句,它是可选的,你可以不使用它,只用if ... else ... end, 你也可以用多个elif。还有就是,虽然我们写了很多行,但是最终渲染得到的内容是没有换行的,也就是任何换行符都会被删除。

实战

在报告中,经常用到非常复杂的计算。例如看下面在报告模板中的真实写法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
======Variables=======

a2=V("maths_level")|table("4stu")|select({"province":pro_code})|which(2)|percent|format({"decimal":1,"multi":100})

a3=V("maths_level")|table("4stu")|select({"province":pro_code})|which(3)|percent|format({"decimal":1,"multi":100})

a4=V("maths_level")|table("4stu")|select({"province":pro_code})|which(4)|percent|format({"decimal":1,"multi":100})

pa=a2+a3+a4

a2=V("maths_level")|table("4stu")|which(2)|percent|format({"decimal":1,"multi":100})

a3=V("maths_level")|table("4stu")|which(3)|percent|format({"decimal":1,"multi":100})

a4=V("maths_level")|table("4stu")|which(4)|percent|format({"decimal":1,"multi":100})

qga=a2+a3+a4
=======Content========

{ % if pa > qga % }
高于全国均值{ { pa - qga } }
{ % elif pa == qga % }
等于全国均值
{ % else % }
低于全国均值{ { qga - pa } }
{ % end % }

其中有两个特殊的行======Variables==============Content========,他们是分隔符,在两行中间可以定义各种用到的变量,这些变量不会被渲染。而content下面的内容是真正会被渲染的部分,但是这部分又用到了上面定义的变量。


图表


序列

word中的图表都是由数据序列构成的,数据序列可以看成是一列数值,比如(1, 2, 3, 4)就是一个数据序列,我们的系统中,用如下方法表达一个序列:

1
v("maths_level")|table("4stu")|select({"province":pro_code})|percent|format({"decimal":1,"multi":100})

以上代码中,我们只使用选择了某个省的数据,指明了变量maths_level,并没有指明which,这样就会返回maths_level的所有水平的百分比。百分比会按照水平值从小到大排列,最终的结果就类似于(1.2, 3.4, 90.0, 5.2)

还有一种方法是使用groupby, 它的作用是将数据分组。例如:

1
v("maths_level")|table("4stu")|select({"province":pro_code})|groupby("gender_new")|which(1)|percent|format({"decimal":1,"multi":100})

以上代码中,groupby指明数据按照性别分组,这样计算结果会得到类似这样的结果(90.0, 5.2),两个数分别表示男生和女生的maths_level为1的百分比。

另有一种特殊的情况是,一个数据序列由多用算法计算得到,比如

1
v("maths_level")|table("4stu")|select({"province":pro_code})|which(1)|groupby("school_loc_new")|percent|format({"decimal":1,"multi":100})| merge |v("maths_level")|table("8stu")|select({"province":pro_code})|which(1)|groupby("school_loc_new")|percent|format({"decimal":1,"multi":100})

以上代码使用了merge算法,将前后两种计算结果合并在一起构成一个序列。merge之前计算结果为四年级的数据,如(4.5, 6.5, 2.4),之后计算的是八年级的数据,结果为(55.4, 34.2, 42.3),合并之后为(4.5, 6.5, 2.4, 55.4, 34.2, 42.3)