月別アーカイブ: 2023年8月

HADで因子分析

はじめに
以前のブログで紹介した、統計ソフトHADについて紹介する。
今回は、DLからの一連の流れと、基礎統計量・因子分析の算出を行う。

インストラクション動画

心理学ではプロマックス回転

抽出方法・回転方法の説明

1. 抽出方法
・最尤法:母集団を推定する考え方。イメージとしては、全国規模。
・主因子法:今得られてるデータの中でまとめる方法。学生の中だけ。
・最小二乗法:よく使われる。尺度の単位を考慮する。

2. 回転方法
・プロマックス回転 (斜交回転)
 因子同士に相関があるようにまとめる方法。心理学は、人の心に関係するという共通事項があるので、相関があると見なしプロマックス回転を使う。
・バリマックス回転 (直交回転)
 反対に相関がないことを前提にする場合はバリマックス回転を使う。

因子分析手順
・分析1回目は, スクリープロットなどから因子数を予測する。
・分析2回目は, それをもとに因子負荷量を算出する。
・算出したら事前に建てた目安をもとに項目の削除を行う。目安としては, 共通性を0.2以下の項目は削除。パターン行列は0.4以上の項目で区切る。内的整合性の検討は, α=.80とするなど適宜調整する。
・分析3回目以降は, 項目の削除がある場合行う。
・残りは, 因子の命名, 下位尺度の算出。表の作成は, 因子負荷量・共通性・α係数・相関行列があればok.(固有率, 寄与率, 累積寄与率を書くことも)

質問紙研究の分析
・因子分析:尺度作成時 (作成しなくても行う場合も)
・相関分析:下位尺度得点から, 他に使用した尺度と
・分散, 重回帰分析:より詳細なデータが欲しいとき
・t検定:因子, 尺度内で, 高群/低群を25%ずつ抽出

因子分析のレポート(SPSS)
 過去に質問紙の作成を行って、因子分析・相関分析・t検定を行った例。統計ソフトは, SPSSを用いた。2年次に執筆したレポートだから書き方が間違いだらけ。表は動画内か先行研究などを参照してください。ついでにSPSSのマニュアルも添付。

マニュアル

====================================================================

余談(js-starとの比較)

js-starと分析結果が合うか確認してみた。
画像の通り、結果は合っていたが、なぜか有意差が出た時にHADのp値の表記がバグる。おそらく設定が足りてないんだと思うがなぜだ。まあでも、心理学レポートのフォーマットにあった図表もでるし、分析の選択も楽だし、外部ソフトを仲介せず、エクセル操作できるのはかなりお得。あとは使いこなせるかが問題

Processing_プログラム解説

はじめに
前回のBFプログラム解説に続き, processingのプログラムについて要点を絞って解説していく。 processingのプログラム解説が終われば, 卒論Ⅰは残りまとめだけ。

要点
・.csv発行
・時刻表示, カウント
・皮膚温の波形をプロット
・Arduino開発環境と連携し, シリアルモニタの値を確認(安静期間の確認も)

SBF230707(ST波形表示, シリアル通信)

import processing.serial.*;

Serial myPort;
String portName = "COM6"; //BT serial port
int baudRate = 115200;
int dataPlotWidth = 640;
int dataPlotHeight = 200;
float[] data = new float[5];
String[] dataMV = new String[5];
float[] prevData = new float[5];
color[] colors = {
  color(255, 0, 0), 
  color(0, 0, 255), 
  color(0, 0, 0, 0), 
  color(0, 0, 0, 0)
};
int datacount=0;
String OutFileName;
String buf2;
PrintWriter writer;
int startMillis;


void setup() 
{
  //size(dataPlotWidth, dataPlotHeight);
  size(600,500);
  myPort = new Serial(this, portName, baudRate);
  
  OutFileName=getTimestamp()+".csv";
  writer = createWriter("./data/"+OutFileName); // Create a new file in the sketch directory
  buf2="";

}

void draw()
{
  
  if((datacount % 600) == 0) {
    background(255);  // clear screen    
    fill(0, 0, 0); // set the fill color to black
    textSize(12);
    text("40 deg", 10, 20); // 
  }
  
  while (myPort.available() > 0) 
  {
    String inString = myPort.readStringUntil('\n');
    
    if (inString != null) 
    {
      inString = trim(inString);
      String[] parts = split(inString, ',');
      
      if(parts.length >3) 
      {
        for (int i = 0; i < 5; i++) 
        {
          prevData[i] = data[i];
          data[i] = map(float(parts[i]), 20, 40, 0, 500);  // Assuming your data is in the range 0-200
          dataMV[i] = parts[i];
          
        }
        String stamp=getTimestamp2();
        String etime= getElapsedTime();
        String buf=stamp+","+etime+","+dataMV[0] + "," + dataMV[1] + "," + dataMV[2] + "," + dataMV[3] + "," + dataMV[4];
        println(buf);
        buf2=buf2+buf+"\n";
        
        if(datacount%10==0){
          writer.print(buf2);
          writer.flush();
          buf2="";
        }

        int xp = datacount%600;
        strokeWeight(1);
        for (int i = 0; i < 1; i++) 
        {
          stroke(colors[i]);
          line(xp-1, 500 - prevData[i], xp, 500 - data[i]);
        }
        
        drawCurrentTime();
        drawElapsedTime();

    
        datacount++;
      }
    }
  }
}

void stop() {
  writer.flush(); // Writes the remaining data to the file
  writer.close(); // Finishes the file
  super.stop();
}

Subroutine1(現在時刻, 経過時間)

String getTimestamp() {
  int y = year();
  int m = month();
  int d = day();
  int h = hour();
  int min = minute();
  int s = second();

  // Use nf() to add leading zeroes to each time component if needed
  String timestamp = nf(y, 4) + nf(m, 2) + nf(d, 2) + "_" + nf(h, 2) + nf(min, 2) + nf(s, 2);
  
  return timestamp;
}

String getTimestamp2() {
  int h = hour();
  int min = minute();
  int s = second();

  // Use nf() to add leading zeroes to each time component if needed
  String timestamp =  nf(h, 2) +":"+ nf(min, 2) +":"+ nf(s, 2);
  
  return timestamp;
}

void drawCurrentTime()
{
  String stamp2=getTimestamp2();
  fill(255); noStroke();
  rect(450, 5,130,50); 
  fill(0); stroke(0);textSize(24); 
  text(stamp2, 450, 30); //   
}

void drawElapsedTime()
{
  String elapsedTime = getElapsedTime();
  fill(255); noStroke();
  rect(450, 55,130,50); 
  fill(0); stroke(0);textSize(24); 
  text(elapsedTime, 450, 60);
}

String getElapsedTime() {
  int elapsedMillis = millis() - startMillis;

  int s = elapsedMillis / 1000;
  int m = s / 60;
  int h = m / 60;

  s = s % 60;
  m = m % 60;

  return nf(h, 2) + ":" + nf(m, 2) + ":" + nf(s, 2);
}

生理心理学実験_資料Ⅰ

Ⅰ計測準備

1. 主な生理指標
 ①皮膚温(Skin Temperature):リラクセーションの指標 ex)匂い, 自然環境
 ②皮膚コンダクタンス(Skin Conductance):感情やストレス ex)お笑い, ホラー
 ③心拍数(Heart Rate):身体活動,集中程度    ex)運動, 映像視聴
 ④心拍変動(Heart Rate Variability):健康,リラックス   ex)睡眠の質
 ⑤心電図:心臓の電気活動 (心臓/心拍のどちらに焦点を当てるか)

*1)  ストレス反応は,瞬時的なもの(皮膚コンダクタンス),ゆっくりしたもの(皮膚温)があるため,実験計画を踏まえどちらを使用するか判断する。ストレス, リラックス時の各生理反応は下記の通り。

2. 計測に必要なもの

 ①皮膚温:緑の計測器, メンディングテープ
 ②発汗のみ:透明の計測器, みの虫クリップ, ピンク色の電極, 手袋
 ③心拍数, 発汗:透明の計測器, 電極, 手袋
 ④ Polar H10(心拍数, 心拍変動):黒色の計測機,水(小皿程度)
 ⑤Polar Unite(心拍数, 歩数, 睡眠など):腕時計型の計測器

*2)  発汗のみ計測する場合, 「②」を使用してください。また, 青色の電極は心電図に使用するので,ピンク色の電極を使用してください。
*3)  心拍数の計測精度は, 「③→④→⑤」の順番です。運動時の心拍数を計測する際は, Polar Uniteがおすすめです。

3. 計測リンク
 計測機(①~③)はそれぞれ機体名が割り振らており,こちらのリンク内「http://kodamalab.sakura.ne.jp/~~~~~/showchannels.php」の赤文字に入力すると計測中のデータが確認できます。

 ①皮膚温:http://kodamalab.sakura.ne.jp/M2TP/showchannels.php
 ②発汗:http://kodamalab.sakura.ne.jp/M2/showchannels.php
 ③心拍数, 発汗:http://kodamalab.sakura.ne.jp/M5log/showchannels.php

*4)   Polar(計測機④, ⑤)は, 確認方法が異なるため, こちらのリンク(http://protolab.sakura.ne.jp/LAB01/?p=22881)を参照してください。

4. 計測方法
 ①皮膚温:右下スイッチを入れる (左下ボタンはイベント記録)
 ②皮膚コンダクタンス:右下スイッチを入れ,左下ボタンを押す(赤く光ればok)
 ③心拍数, 発汗:(センサを上向きとして)右下のボタンを長押し

*5) 波形が緩やかな放物線を描いていれば正常だが, ギザギザした波形の場合, 計測が失敗している可能性が高い(ex.センサの装着に問題)。

=======================================================================

Ⅱ 参照サイト

1. 計測機の引用文献
・皮膚温/心拍数, 発汗:長野・吉田(2018).
・発汗(単一):長野他(2019).
・Polar Unite/H10:POLAR社製

2. 基礎実験
・皮膚温:リンク
・発汗:リンク

3. 分析方法の解説
・分散分析等:リンク

=======================================================================

HADを使ってみる

はじめに
 卒論の統計処理を行おうとしたものの、js-starでは3要因の分散分析までしかできないことを知った。以前のブログで分析候補を挙げたところ、生理指標の大半が4, 5要因分散分析のため、かなり厳しめである。sasはちょいと面倒だし、だからといってspssを使うにも一々大学行って、21:50までしかできないから、新たなる統計ソフトのHADを使ってみる。分析したら、図表を作ってくれるらしい。

HADの詳細
・機能一覧:こちら
・DLサイト:こちら