生成实验数据 SPSS样本检验P值0.01~0.05

SPSS实验数据生成
实验数据不理想?需要调整?
改进你的数据,生成你想要的数据!
p值,均值,正态性,方差等等,均可按需调整
同时满足独立样本t检验,配对样本t检验要求,随意调整,批量生成测试(前测,后测)数据,量表数据

关键词:SPSS 数据生成 P值 均值 方差 配对样本检验 独立样本检验

注:本文使用MATLAB工具开发,附完整源代码,不会使用MATLAB的朋友可以私信我交流哦

题目背景

测试的样本选择两个班级的同学,一个班作为EC实验组,一个作为CC实验组,首先对EC CC组进行一次测验,统计分数,测验后,对EC组进行培训干预,CC组则正常进行,不加干预,一段时间后,再次用同样的题目进行测验,统计分数,使用SPSS进行分析,观察干预后是否有效果,具体的评价标准就是进行T检验后的P值要满足以下要求:

配对样本T检验:
EC前测后测数据p值:0.01-0.05 显著差异
CC前测后测数据p值:>0.05     无显著差异

独立样本T检验:
EC CC前测p值:>0.05     无显著差异
EC CC后测p值:0.01-0.05 显著差异

一次测试中,有若干个维度的问题,每个维度又有若干个问题,分别统计每个维度的总分,有的维度分数预期上涨,有的分数预期下降,有的维度则不做要求,基本不变,这些维度的总分进行T检验,P值夜要求满足如上的指标。这样才认为测验数据良好。

提出问题

实际实验中,数据总是不能很好地满足以上需求,要么是变化不明显,要么是变化趋势不符合预期效果,要么是P值不在范围内。

那么我们可以生成一组实验数据用于模拟真实的情况,保证满足以上所有要求。

MATLAB实现

这里我使用matlab生成实验数据,需要确定的参数有:EC CC实验组各有多少人,问卷维度数量,每个维度的总分,每个维度期望的平均分,每个维度EC组是否有变化,变化趋势是增长还是减少,对于P值的要求指标是怎样的。在知道了这些基本信息后,就能够按照需要生成数据啦。

首先生成一组正态分布的随机值,大小为10000个,再按照所需要的数据量,也就是实验组的人数,对其进行“采样”,在这10000个数据中等间隔取出50个数据,但是为了使数据更加贴近真实的情况,在取出数据时左右摇摆一下,使生成的数据并不严格满足正态分布。这样两次随机选择也增强了数据的变化性。这样就生成了一组大小为50数据。

function [stu_grade]=data_gen(S_num,full_grade,d_mean,length)

S_num = S_num+1;
% full_grade=Q_num*6;

% 生成一组标准正态分布的随机数
randn_num = 10000; % 指定生成的随机数数量
d_randn = randn(randn_num, 1);
d_randn = d_randn*length+d_mean;
d_randn = sort(d_randn);
d_randn = round(d_randn*1000);

stu_grade = zeros(S_num,1);%学生分数矩阵

interval = randn_num / S_num;
for i = 1:1:S_num-1
     d_sel = rand() * interval / 10;%均匀分布随机数
      stu_grade(i,1) = d_randn(round(i*interval + d_sel),1);
%      stu_grade(i,1) = d_randn(round(i*interval),1);
     if stu_grade(i,1)>=full_grade*1000
         stu_grade(i,1) = full_grade*1000;
     end
end
stu_grade=stu_grade./1000;

end

接下来,调用上面的函数,生成一个维度的四组数据,使其满足P值、均值要求,若均值P值不满足就重新生成一次,直到满足为止。但是EC组后测值是直接影响P值的,所以在生成很多次数据后,任然不满足要求时,改变EC后测的均值,再生成数据进行判断。直到生成满足要求的数据为止。这样就生成了一组满足要求的,同一维度下的四组数据。


function [data_allEC,data_allCC,p_level_all] = fun_search_p(S_num_EC,S_num_CC,D_index,full_grade,length,p_demand,M_EC_b,M_CC_b,M_EC_a,M_CC_a)

    %数据含义
    % M_EC_b EC前测期望的平均值 mean EC befor
    % M_CC_b CC前测期望的平均值
    % M_EC_a EC后测期望的平均值
    % M_CC_a CC后测期望的平均值

    data_val_FINAL  = 0;%生成的数据是否满足
    data_val_P      = 0;%生成的数据P值是否满足
    data_val_M      = 0;%生成的数据均值是否满足
    
    cnt_times_1    = 0  ;%在同一组均值下的迭代次数
    cnt_times_1max = 50;%在一组均值下的迭代最大次数
    
    
    if (M_EC_a>M_EC_b)
        EC_trend = 1;%EC变化趋势
    else
        EC_trend = -1;
    end
    
    
    
    cnt_times_2 = 50;%均值改变的次数
    EC_step     = M_EC_b/500;%步进值,与数据大小相关,数据大步进值大 /400是检验出来的值
    
    
    for i=1:1:cnt_times_2
        
        if(p_demand)  %p值有要求,才对EC后测做调整
            M_EC_a = M_EC_b + EC_trend*EC_step*i;%EC后测均值 不断更改
        end
    
    while((~data_val_FINAL)&&(cnt_times_1 <= cnt_times_1max))
        
        % 生成数据data_gen(S_num_EC,Q_num,d_mean,length)
        length_t = randi([0,length],1,1)+1;%方差调整
        B_EC = data_gen(S_num_EC,full_grade,M_EC_b,length_t);

        length_t = randi([0,length],1,1)+1;
        B_CC = data_gen(S_num_CC,full_grade,M_CC_b,length_t);

        length_t = randi([0,length],1,1)+1;
        A_EC = data_gen(S_num_EC,full_grade,M_EC_a,length_t);

        length_t = randi([0,length],1,1)+1;
        A_CC = data_gen(S_num_CC,full_grade,M_CC_a,length_t);
        
        % 独立样本t检验
        % 2.EC CC后测p值0.01-0.05
        [~, P_aEC_aCC, ~, ~] = ttest2(A_EC, A_CC);
        % 3.EC CC前测p值>0.05
        [~, P_bEC_bCC, ~, ~] = ttest2(B_EC, B_CC);

        % 配对样本t检验
        % 1.EC的前后测p值0.01-0.05
        [~, P_bEC_aEC, ~, ~] = ttest(B_EC, A_EC);
        % 4.CC的前后测p值>0.05
        [~, P_bCC_aCC, ~, ~] = ttest(B_CC, A_CC);

    
        if (p_demand)%有显著差异
            if( (P_bEC_aEC>0.01)&&(P_bEC_aEC<0.05)&&...
                (P_aEC_aCC>0.01)&&(P_aEC_aCC<0.05)&&...
                (P_bEC_bCC>0.05)&& ...
                (P_bCC_aCC>0.05))%p值要求
                    
                data_val_P = 1;
            else
                data_val_P = 0;
            end
        else %无显著差异
            if( (P_bEC_aEC>0.05)&&...
                (P_aEC_aCC>0.05)&&...
                (P_bEC_bCC>0.05)&& ...
                (P_bCC_aCC>0.05))%p值要求
                data_val_P = 1;
            else
                data_val_P = 0;
            end
        end

        
        if(p_demand)%要求有显著差异
            if(EC_trend>0)%呈上升趋势
                if(M_EC_a > M_EC_b)%均值要求
                    data_val_M = 1;
                else
                    data_val_M = 0;
                end
            else%下降趋势
                if(M_EC_a < M_EC_b)
                    data_val_M = 1;
                else
                    data_val_M = 0;
                end
            end
        else %不要求显著差异,均值不做要求
            data_val_M = 1;
        end

        data_val_FINAL = data_val_M && data_val_P;%P值均值均满足,生成数据满足条件

        
        cnt_times_1 = cnt_times_1 + 1;
        
    %     disp(['同一均值下迭代次数:',num2str(cnt_times_1)]);
    end
    disp(['维度:',num2str(D_index)]);
    disp(['均值次数:',num2str(i),' 均值:', num2str(M_EC_a)]);
        
        % 显示p-value
        fprintf('EC的前后测p值: %.4f\n',P_bEC_aEC);
        fprintf('EC CC后测p值: %.4f\n', P_aEC_aCC);
        fprintf('EC CC前测p值: %.4f\n', P_bEC_bCC);
        fprintf('CC的前后测p值: %.4f\n',P_bCC_aCC);
        if data_val_P%如果找到有效就退出for
            break;
        else
        end
        cnt_times_1 = 0;%运算完一个均值就清零
    end
    
        mean_bEC = mean(B_EC);
        mean_bCC = mean(B_CC);
        mean_aEC = mean(A_EC);
        mean_aCC = mean(A_CC);
        
        % 显示平均值
        disp(['befor_EC的平均值:', num2str(mean(mean_bEC))]);
        disp(['befor_CC的平均值:', num2str(mean(mean_bCC))]);
        disp(['after_EC的平均值:', num2str(mean(mean_aEC))]);
        disp(['after_CC的平均值:', num2str(mean(mean_aCC))]);
    
        % 显示p-value
        fprintf('EC的前后测p值: %.4f\n', P_bEC_aEC);
        fprintf('EC CC后测p值: %.4f\n', P_aEC_aCC);
        fprintf('EC CC前测p值: %.4f\n', P_bEC_bCC);
        fprintf('CC的前后测p值: %.4f\n', P_bCC_aCC);
    
    
    %让数据对应起来
    %合并
    data_EC = [B_EC,A_EC];
    data_CC = [B_CC,A_CC];
    %打乱
    rowrank_EC = randperm(size(data_EC, 1)); 
    rowrank_CC = randperm(size(data_CC, 1)); 
    data_EC = data_EC(rowrank_EC,:);
    data_CC = data_CC(rowrank_CC,:);
    %拆分
    B_EC(:,1) = data_EC(:,1);
    A_EC(:,1) = data_EC(:,2);
    B_CC(:,1) = data_CC(:,1);
    A_CC(:,1) = data_CC(:,2);
    
    
    data_allEC(:,:) = [B_EC,A_EC];
    data_allCC(:,:) = [B_CC,A_CC];
    p_level_all(:,:) = [P_bEC_aEC,P_aEC_aCC,P_bEC_bCC,P_bCC_aCC];
    
    
    
    end
    

 这样就可以生成满足要求的一个维度的数据啦

如果需要让总分也满足这些要求,那么再用同样的方法,重复几次,生成多个维度的数据就好啦

效果

生成的数据

各组数据的概率密度函数

具体的参数如下:

第1维度
befor_EC的平均值: 18.888889
after_EC的平均值: 19.185185
befor_CC的平均值: 18.773585
after_CC的平均值: 18.735849
EC的前后测p值: 0.034349
EC CC后测p值: 0.020505
EC CC前测p值: 0.699141
CC的前后测p值: 0.159267
第2维度
befor_EC的平均值: 18.759259
after_EC的平均值: 19.111111
befor_CC的平均值: 18.773585
after_CC的平均值: 18.716981
EC的前后测p值: 0.011976
EC CC后测p值: 0.035440
EC CC前测p值: 0.968641
CC的前后测p值: 0.689840
第3维度
befor_EC的平均值: 33.870370
after_EC的平均值: 33.870370
befor_CC的平均值: 33.773585
after_CC的平均值: 33.830189
EC的前后测p值: 1.000000
EC CC后测p值: 0.882215
EC CC前测p值: 0.611523
CC的前后测p值: 0.083206
第4维度
befor_EC的平均值: 18.759259
after_EC的平均值: 18.740741
befor_CC的平均值: 18.735849
after_CC的平均值: 18.849057
EC的前后测p值: 0.894219
EC CC后测p值: 0.791519
EC CC前测p值: 0.948983
CC的前后测p值: 0.436027
第5维度
befor_EC的平均值: 38.611111
after_EC的平均值: 39.648148
befor_CC的平均值: 38.735849
after_CC的平均值: 38.698113
EC的前后测p值: 0.010892
EC CC后测p值: 0.023187
EC CC前测p值: 0.816461
CC的前后测p值: 0.889663
总分 EC的前后测p值: 0.0129
总分 EC CC后测p值: 0.0248
总分 EC CC前测p值: 0.9616
总分 CC的前后测p值: 0.9715
运行时间: 34.6172s 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值