CopilotでRのスクリプトを作成する:相関、散布図、直線回帰、重回帰

今回は、CopilotにRのスクリプトを提案してもらいましょう。

青のボックス内に書いてあるのがプロンプトです。右端のアイコンをクリックするとCopilotの回答を表示したり隠したりできます。その下にはRでのスクリプトの実行結果を示します。

まず、Rの標準データセットで相関に関するデータサンプルがあるか聞いてみます。

Rの標準データセットに相関に関するサンプルデータはありますか?

はい、Rには相関を調査するのに適した標準データセットがいくつか含まれています。以下のようなデータセットがあります。

  • mtcars:32種類の車に関する燃費や馬力、重量などのデータが含まれており、これらの変数間の相関を分析するのに便利です。
  • iris:アヤメの種類ごとの花弁の長さや幅などのデータがあり、数値変数間の関係性を調べるのに適しています。
  • airquality:大気汚染に関するデータで、温度や風速とオゾン濃度の相関を検討できます。
  • mtcars:自動車の仕様データセットで、燃費と車両重量の関係などを分析できます。

例えば、mtcarsデータセットの変数間の相関係数を求めるには、以下のように記述できます。

data(mtcars)  # データセットをロード
cor(mtcars)   # 相関係数を計算

特定の変数間の相関を調べたい場合は、例えばmpghpの関係を確認するには以下のようにします。

cor(mtcars$mpg, mtcars$hp)

他にも、cor.test()関数を使うことで、相関の統計的有意性を検定できます。

興味のあるデータセットがあれば、詳しく説明できますので、お知らせください!

特に指示はしていないのですが、データセットの解説と、相関係数の計算のスクリプトが提示されました。それをRのエディタにコピー・貼り付けて実行すると、以下の結果が、コンソールに出力されました。32種類の車の燃費、馬力などの値について、cor()関数での演算結果が、相関行列として得られました。

次に、散布図を描画してみようと思います。馬力hpと燃費mpgの関係を見たいと思います。グラフ作成にはggplot2というパッケージが良く使われているので、それを使うよう指示します。

mtcarsのhpをX軸に、mpgをY軸に散布図をggplot2で描くスクリプトは?

ggplot2を使ってmtcarsデータセットのhpをX軸、mpgをY軸にした散布図を描くには、以下のRスクリプトを使用できます。

# ggplot2パッケージを読み込む
library(ggplot2)

# mtcarsデータセットを使用して散布図を描画
ggplot(mtcars, aes(x = hp, y = mpg)) +
  geom_point() +                      # 散布図のポイントを追加
  labs(title = "Horsepower vs. Miles Per Gallon", 
       x = "Horsepower (hp)", 
       y = "Miles Per Gallon (mpg)") +
  theme_minimal()                      # シンプルなテーマを適用

このスクリプトでは、ggplot()を使ってデータを指定し、geom_point()で散布図を作成しています。また、labs()を使ってタイトルや軸ラベルを設定し、theme_minimal()でシンプルなデザインにしています。

もし回帰線を追加したい場合は、geom_smooth()を使うと便利です。

ggplot(mtcars, aes(x = hp, y = mpg)) +
  geom_point() +
  geom_smooth(method = "lm", se = FALSE, color = "blue") +
  labs(title = "Horsepower vs. Miles Per Gallon with Regression Line",
       x = "Horsepower (hp)",
       y = "Miles Per Gallon (mpg)") +
  theme_minimal()

このコードでは、geom_smooth(method = "lm")を追加することで、線形回帰をプロットしています。

カスタマイズの方法や他の描画スタイルについても、お手伝いできますので、気軽に聞いてくださいね!

散布図描画のための、スクリプトが提示されました。まず、それをRのエディタにコピー・貼り付けて実行すると、以下のグラフが作成されました。

これも特にプロンプトでは指示していないのですが、回帰直線を描画に追加するスクリプトが提示されたので、それを実行すると以下のグラフが作成されました。この場合、前のグラフに上書きされます。

それでは、hpとmpgの散布図とhpとcylの散布図を重ねて描画するにはどうするかCopilotに聞いてみましょう。

hpとmpgの散布図の回帰直線のグラフに重ねてhpとcylの散布図と
回帰直線を描画するには?mpgとcylではポイントと直線の色を変えてください。

ggplot2を使ってhpmpghpcylの散布図と回帰直線を重ねて描画するには、aes()colorオプションを利用してポイントと回帰線の色を変更すると便利です。以下のRスクリプトで実現できます。

# 必要なパッケージを読み込む
library(ggplot2)

# グラフの作成
ggplot(mtcars, aes(x = hp)) +
  # mpgの散布図と回帰直線(青色)
  geom_point(aes(y = mpg, color = "mpg"), alpha = 0.7) +
  geom_smooth(aes(y = mpg, color = "mpg"), method = "lm", se = FALSE) +
  # cylの散布図と回帰直線(赤色)
  geom_point(aes(y = cyl, color = "cyl"), alpha = 0.7) +
  geom_smooth(aes(y = cyl, color = "cyl"), method = "lm", se = FALSE) +
  # カスタムの凡例タイトル
  scale_color_manual(values = c("mpg" = "blue", "cyl" = "red")) +
  labs(title = "Horsepower vs. MPG and Cylinders",
       x = "Horsepower (hp)",
       y = "Values",
       color = "Variable") +
  theme_minimal()

このスクリプトでは:

  • aes(y = mpg, color = "mpg")aes(y = cyl, color = "cyl") を使い、mpgを青、cylを赤で描画しています。
  • geom_smooth() でそれぞれ回帰直線を追加。
  • scale_color_manual(values = c("mpg" = "blue", "cyl" = "red")) により、凡例の色を指定。

このコードを実行すると、hpをX軸に、mpgcylをY軸にした散布図が表示され、色分けされた回帰直線が重ねられます!

他にカスタマイズしたい点があれば、遠慮なく聞いてくださいね。

Copilotが提示したスクリプトをRのエディタにコピー・貼り付けしてそのまま実行すると以下のグラフが作成されました。

馬力hpが大きくなるほど1ガロン当たりの走行距離mpgが短くなり(青)、馬力hpが大きいほどエンジンのシリンダー数cylが多くなる関係があることが分かります。

それでは、直線回帰の切片と係数を出力するにはどのようなスクリプトを書けばいいのか聞いてみたいと思います。まず、hpとmpgの2つの変数についてです。

hpとmpgの間の直線回帰の切片の値と傾きの係数の値を得るにはどの
ようなスクリプトを書けばいいですか?X軸にhp、Y軸にmpgとしてください。

lm() 関数を使って、hp を X 軸、mpg を Y 軸とする線形回帰の切片(intercept)と傾き(coefficient)を求めるには、以下のスクリプトを使用できます。

# mtcarsデータセットをロード
data(mtcars)

# 線形回帰モデルを作成(mpgを目的変数、hpを説明変数)
model <- lm(mpg ~ hp, data = mtcars)

# 回帰係数(切片と傾き)を取得
coefficients <- coef(model)

# 係数の表示
print(coefficients)

説明:

  • lm(mpg ~ hp, data = mtcars)mpg を目的変数(Y 軸)、hp を説明変数(X 軸)として線形回帰モデルを作成します。
  • coef(model) を使って切片(intercept)と傾きの係数(slope)を取得します。
  • print(coefficients) で結果を表示。

このスクリプトを実行すると、出力される値は以下の形式になります。

(Intercept)          hp  
  X.XXXXXXX      Y.YYYYYY  

ここで (Intercept) は切片の値、hp は傾きの係数を示します。

もし、回帰モデルの詳細な統計情報も確認したい場合は、summary(model) を実行すると、p 値や決定係数 (R-squared) なども確認できます。

summary(model)

カスタマイズや可視化の方法など、さらに詳しく知りたいことがあれば、お気軽に聞いてください!

lm()関数を用いて、直線回帰の分析結果を変数modelに格納し、coef(model)で切片と傾きが得られることが分かります。このスクリプトをそのまま実行すると以下の結果がコンソールに出力されました。summary(model)でp値、決定係数も出力されています。

それでは、燃費mpgを従属変数として、それ以外の変数を説明変数にして重回帰分析をするにはどのようなスクリプトを書けばいいかCopilotに聞いてみましょう。

mpgを従属変数として、それ以外の変数を説明変数にして重回帰分析を
するにはどのようなスクリプトを書けばいいですか?切片、係数、p値、
決定係数の値も出力するようにしてください。

lm() 関数を使って mpg を従属変数(目的変数)として、それ以外の変数を説明変数(独立変数)に設定し、重回帰分析を行い、切片・回帰係数・p値・決定係数を出力するスクリプトは以下のようになります。

# 必要なパッケージをロード
data(mtcars)

# 線形回帰モデルを作成(mpgを従属変数、その他の変数を説明変数に設定)
model <- lm(mpg ~ ., data = mtcars)

# 回帰モデルの概要を表示
summary_model <- summary(model)

# 切片と回帰係数を取得
coefficients <- coef(model)

# p値を取得
p_values <- summary_model$coefficients[,4]

# 決定係数を取得
r_squared <- summary_model$r.squared

# 結果を出力
print("回帰係数(切片と傾き):")
print(coefficients)

print("p値:")
print(p_values)

print("決定係数 (R-squared):")
print(r_squared)

説明:

  • lm(mpg ~ ., data = mtcars)mpg を従属変数とし、他の変数を説明変数として重回帰分析を実行します。
  • summary(model) を取得し、回帰係数・p値・決定係数 (R-squared) を抽出します。
  • summary_model$coefficients[,4] で p値を取得できます(各説明変数に対する統計的有意性)。
  • summary_model$r.squared で決定係数を取得し、モデルの適合度を確認できます。
  • print() により結果を表示。

このスクリプトを実行すると、各変数の回帰係数、p値、決定係数の値が出力されます。モデルの評価や変数の選択についても相談できますので、気軽に聞いてくださいね!択についても相談できますので、気軽に聞いてくださいね!

これもそのままコピー・貼り付けしてRで実行した結果が以下の通りです。決定係数は0.869です。

それでは、最後に燃費mpgを従属変数として、説明変数にhp、wt、qsec、amの4つだけでモデルを作る場合のスクリプトをCopilotに書いてもらいます。これら4つの説明変数は上記のp値が小さいものを選びました。

mpgを従属変数として、説明変数にhp、wt、qsec、amの4つだけで
モデルを作る場合のスクリプトは?

lm()関数を使い、mpgを従属変数として、hpwtqsecamの4つを説明変数に設定して重回帰分析を行う場合、以下のスクリプトを使用できます。

# mtcarsデータセットをロード
data(mtcars)

# 線形回帰モデルを作成(mpgを従属変数、hp, wt, qsec, am を説明変数として設定)
model <- lm(mpg ~ hp + wt + qsec + am, data = mtcars)

# モデルの要約を表示
summary(model)

説明:

  • lm(mpg ~ hp + wt + qsec + am, data = mtcars)mpg を従属変数、hpwtqsecam を説明変数に設定し、重回帰分析を実行します。
  • summary(model) を実行すると、回帰係数(切片と各変数の傾き)、p値、決定係数などの統計情報が表示されます。

モデルの評価や変数の選択についてさらに詳しく知りたい場合は、お気軽に聞いてください!

ここでは、model = lm(mpg ~ hp + wt + qsec + am, data = mtcars)という記述方法に注目してください。多変量のモデルの指定方法です。これらのスクリプトを、Rで実行した結果は以下の通りでした。

各変数の意味を表にしてもらうのをCopilotに頼んでみましょう。

mtcarsの各変数が何を表しているか表を作成してください。

もちろんです!mtcars データセットに含まれる各変数の意味を表にまとめました。

変数名説明
mpg燃費 (Miles Per Gallon)
cylシリンダー数
disp排気量 (cubic inches)
hp馬力 (Horsepower)
dratリアアクスル比 (Rear Axle Ratio)
wt車両重量 (1000ポンド単位)
qsec1/4マイル走行時間(秒)
vsエンジンの形状 (0 = V型, 1 = 直列型)
am変速機の種類 (0 = オートマ, 1 = マニュアル)
gearギア数
carbキャブレター数

このデータセットは、自動車の性能を分析するために広く使われています。特に、mpg (燃費) と他の変数の関係を調べることで、燃費に影響を与える要因を分析できます。

他に詳しく知りたいことがあれば、気軽に聞いてくださいね!

これらの変数の意味から結果を考察すると、馬力と車両重量に対する係数はマイナスなので、これらの値が大きいほど燃費は悪くなる、オートマ(0)に対してマニュアル(1)は係数がプラスなので、マニュアルの方が燃費がいい、1/4マイル走行時間、すなわち0-4の時間が長く、加速が悪いほど燃費がいい、ということが分かります。調整決定係数が0.8368でこれら4つの因子で燃費の大部分が決まるということが分かります。

医学研究でも相関、直線回帰、重回帰分析が適用される例は多いと思います。また、散布図を描いて視覚的に検討することも多いと思います。今回の例でも、Copilotに聞きながらRで解析を進めていくのは有用と思わされました。今回の例は医学の例ではありませんが、応用は容易と思います。

CopilotはRのスクリプトの部分は、コピー用のボタンがついており、それをクリックして、Rで貼り付けるだけですぐ実行できます。つまり、スクリプトを自分で書き込む必要が無くなり、効率化が図れます。

多項ロジスティック回帰分析 – 2 – Google Geminiに聞きながらnnetで解析

Google Geminiを使って、多項ロジスティック回帰分析をさらに探索してみましょう。

Rのパッケージnnetを用いて、医療のデータではありませんがサンプルデータで実際に分析を実行し、説明変数の値から推定するところまで、Gemini 2.5 Flashに聞きながら、やってみます。

まず、試しに使えるデータセットが無いか聞いてみます。

Rパッケージのnnetに付属しているデータセットは?

付属するデータセットはないという回答でした。 その代わりに R に標準で付属しているデータセットがいくつか リストアップされました。 irisは、アヤメのデータセットで、分類問題の例としてよく使われますとのことです。

irisのデータセットを変数datに格納するRのスクリプトは?

dat <- iris

そこで次のスクリプトを実行し、どのようなデータか確認しました。コンソールへの出力です。<-と=は同じで、右側の変数のデータを左側の変数に格納します。データ型も同じになります。

ここでは、サンプル1~4までのデータを示します。実際にはアヤメ150個体のデータです。連続変数の説明変数が4種類、従属変数はSpeciesで、アヤメの種類の様です。アヤメの種類はいくつあるのか調べてみましょう。

データセットdatのSpeciesの属性はいくつあるか調べるには?

Speciesは文字列の名義変数で、nlevels(dat$Species)で何種類含まれているかを知ることができるようです。

3種類であることがわかりました。

名義変数のそれぞれの値はlevelsと表現するようなので、それぞれの名義変数の値を知るにはどうするかを聞いてみます。

Speciesのレベルを知るには?

levels(dat$Species)でわかるようです。

setosa, versicolor, virginicaの3種類であることが確認できました。データフレームdatのカラム名を出力させたいと思います。

datのカラム名を出力するには?

colnames(dat)で、あるいはnames(dat)でカラム名を出力できるそうです。

さて、以上からこのデータセットirisは”Sepal.Length”、”Sepal.Width”、 “Petal.Length” “Petal.Width”の4つの説明変数から”Species”を推定するために、多項ロジスティック回帰分析を適用できそうなことが分かりました。nnetを使って多項ロジスティック回帰分析を実行してみようと思います。

Rのパケージnnetを使って、説明変数”Sepal.Length”、”Sepal.Width”、 “Petal.Length” “Petal.Width”から従属変数”Species”を推定するための多項ロジスティック回帰分析を実行するスクリプトは?変数datにirisのデータが格納されています。

nnetパッケージのインストール、パッケージの読み込み、データの準備の解説が提示されます。

# nnetパッケージを読み込む 

library(nnet)

これらに続いて、多項ロジスティック回帰分析の実行の解説が提示され、multinom関数を使って分析するスクリプトが提示されます。その部分を以下に示します。

# 多項ロジスティック回帰モデルの構築

# trace = FALSE は、最適化の過程を表示しないようにするためのものです

model <- multinom(Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width, data = dat, trace = FALSE)

# または、すべての説明変数を使用する場合

# model <- multinom(Species ~ ., data = dat, trace = FALSE)

そして、結果の確認のスクリプトは:

# モデルの要約を表示 summary(model)

これらをRのエディタにコピー・貼り付けして実行してみます。

このような結果が出力されました。実は、Geminiが出力例として提示した内容とは異なっていました。この結果を見ると、setosaを参照基準として、versicolor、virginicaに対する係数が計算されています。Geminiの出力例では、参照基準がvirginicaになっており、setosa、versicolorに対する係数が提示されていました。実際のデータがこちらです。

それでは、本当にそうなのか、multinom関数でreferenceをvirginicaに変えるにはどうしたらいいかGeminiに聞いてみましょう。

multinom関数でレファレンスをvirginicaにするにはどうしますか?

デフォルトでは、従属変数の並び順で最初の変数を参照基準referenceにするという説明がされ、もしvirginiaに変更するのであれば、次のスクリプトを実行するという説明でした。従って、上記の出力例はデフォルトでの解析結果ではないということになります。

参照基準の変更ができるかやってみます。

dat$Species <- relevel(dat$Species, ref = “virginica”)

# レベルが正しく変更されたか確認 

levels(dat$Species)

さて、今度は参照基準virginiaに対する、setosa、versioclorに対する係数の値が出力されました。しかし、これも上記の出力例とは違う値になっています。つまり、Geminiが出力例(一部)として提示したデータの由来は分かりませんが、どうも間違いのようです。

さて、元のデータのまま、再度同じ解析を実行しておきます。そして、Geminiからの回答にあった、係数と標準誤差、p値(両側検定)の値を出力してみます。

# 係数と標準誤差を取得 

z <- summary(model)$coefficients / summary(model)$standard.errors 

# p値を計算 (両側検定) 

p_values <- (1 – pnorm(abs(z), 0, 1)) * 2 print(p_values)

続いて、説明変数の値から、Speciesの推定predictionをするにはどうするかGeminiに聞いてみましょう。まず、分析の元のデータ、つまり訓練データに対して適用してみます。

datの4つの説明変数の値からSpeciesを推定するにはどうしますか?

predict関数を使用することと、訓練データの場合の推定結果、正解率の計算、推定確率の計算のためのスクリプトが提示されました。Species、つまりアヤメの名称をクラスと呼んでいます。

# 訓練データに対する推定されたクラス

predicted_class <- predict(model, newdata = dat, type = “class”)

print(head(predicted_class))

# 実際のSpeciesと比較して、どの程度合っているか確認する(混同行列)

confusion_matrix <- table(Actual = dat$Species, Predicted = predicted_class)

print(confusion_matrix)

# 正解率の計算

accuracy <- sum(diag(confusion_matrix)) / sum(confusion_matrix)

cat(“モデルの正解率:”, round(accuracy * 100, 2), “%\n”)

# 訓練データに対する各クラスの推定確率

predicted_probs <- predict(model, newdata = dat, type = “probs”)

print(head(predicted_probs))

irisのデータは、nrow(dat)で150、つまり150個体のアイリスのデータを含んでいます。ここでの出力はhead()関数で最初の6個だけになっています。confusion_matrixつまり混同行列の結果をみると、setosa50個体はすべてsetosaとして推定され、versicolorは50個体の内49個体が正しくversicolorとして推定され、virginica1は50個体の内49個体が正しくvirginicaとして分類されていることが分かります。正解率の計算では98.67%でした。非常に高い精度です。

最後の、訓練データに対する各クラスの推定確率を見ると個体1はsetosaの確率が1.0でversicolor、verginicaの確率はほぼ0ということが分かります。以降個体6までの結果が出力されていますが、print(predicted_probs)で、150個体すべての結果が出力されます。

さて、Geminiの回答には、新しいデータポイントについてSpeciesを推定する方法、スクリプトについても説明があります。以下がその部分です。臨床の場合であれば、個々の対象者のデータから、診断、あるいは病態を推定することに相当します。ここでは、3つの個体のデータを作成して、推定を行っています。

——–
2. 新しいデータポイントについてSpeciesを推定する

これは、モデルを未知のデータに適用する場合の一般的な使用方法です。新しいデータは、モデル構築時に使用した説明変数と同じカラム名とデータ型を持つデータフレームである必要があります。

例として、新しいアヤメの測定値を使ってSpeciesを推定してみましょう。

R

# 新しいデータポイントを作成

# カラム名はモデル構築時に使用した説明変数と完全に一致させる必要があります

new_iris_data <- data.frame(

  Sepal.Length = c(5.1, 6.0, 7.0),

  Sepal.Width = c(3.5, 2.7, 3.2),

  Petal.Length = c(1.4, 4.5, 6.0),

  Petal.Width = c(0.2, 1.5, 2.0)

)

print(new_iris_data)

# 新しいデータポイントに対する推定されたクラス

predicted_new_class <- predict(model, newdata = new_iris_data, type = “class”)

cat(“\n新しいデータに対する推定されたSpecies:\n”)

print(predicted_new_class)

# 新しいデータポイントに対する各Speciesカテゴリの推定確率

predicted_new_probs <- predict(model, newdata = new_iris_data, type = “probs”)

cat(“\n新しいデータに対する各Speciesの推定確率:\n”)

print(predicted_new_probs)

このように、predict()関数を使うことで、学習済みモデルを用いて説明変数の値から従属変数Speciesを推定することができます。

—————

これらのスクリプトをRで実行してみます。

従って、個体1はsetosa、個体2はversicolor、個体3はvirginicaと推定されています。

さてirisのデータは説明変数が連続変数のみでした。説明変数に名義変数がある場合、どのように扱うのか、特に参照基準の設定について聞いてみましょう。

説明変数に名義変数がある場合、例えば、x1: A, B, C, D;x2: X, Y, Zのような場合、multinom関数を使う場合に、参照基準の設定は?

Rのmultinom関数で、説明変数に名義変数(カテゴリカル変数)がある場合、その説明変数の参照基準(レファレンスレベル)を設定する方法は、従属変数の場合と全く同じ考え方です。

Rの統計モデリング関数(lm, glm, multinomなど)は、因子(factor)型変数を自動的にダミー変数に変換して回帰分析に組み込みます。この際、デフォルトではその因子の最初のレベルが参照基準となり、そのレベルに対応するダミー変数はモデルから除外(係数が0として扱われる)されます。他のレベルの係数は、この参照基準レベルと比較してどのくらい異なるかを示します。

したがって、説明変数x1やx2の参照基準を設定したい場合は、それぞれの変数をfactor型であることを確認し、relevel()関数を使って参照基準にしたいレベルを最初のレベルに設定します。

以下に具体的なスクリプトを示します。

1. サンプルデータの作成

まず、ご提示のx1 (A, B, C, D) と x2 (X, Y, Z) のような名義変数を含むダミーのデータセットを作成します。

R

# データをシミュレート

set.seed(123)

n <- 100 # サンプルサイズ

# 説明変数 x1 (A, B, C, D)

x1_levels <- c(“A”, “B”, “C”, “D”)

x1 <- sample(x1_levels, n, replace = TRUE, prob = c(0.25, 0.25, 0.25, 0.25))

# 説明変数 x2 (X, Y, Z)

x2_levels <- c(“X”, “Y”, “Z”)

x2 <- sample(x2_levels, n, replace = TRUE, prob = c(0.33, 0.33, 0.34))

# 従属変数 Species (irisデータと同様に3カテゴリを想定)

species_levels <- c(“setosa”, “versicolor”, “virginica”)

species <- sample(species_levels, n, replace = TRUE) # ランダムなSpeciesを生成

# データフレームを作成

my_dat <- data.frame(

  Species = as.factor(species), # 従属変数はfactor型

  x1 = as.factor(x1),            # 説明変数x1はfactor型

  x2 = as.factor(x2)             # 説明変数x2はfactor型

)

# データの構造を確認

str(my_dat)

2. 説明変数の参照基準の設定

relevel()関数を使って、各説明変数の参照基準を変更します。

x1の参照基準をBにする場合:
R

my_dat$x1 <- relevel(my_dat$x1, ref = “B”)

levels(my_dat$x1) # 確認: “B” が最初になっているはず

x2の参照基準をZにする場合:
R

my_dat$x2 <- relevel(my_dat$x2, ref = “Z”)

levels(my_dat$x2) # 確認: “Z” が最初になっているはず

3. multinom関数の実行

参照基準を設定したデータフレームmy_datを使ってmultinom関数を実行します。

R

library(nnet)

# (オプション) 従属変数Speciesの参照基準も設定する例 (もし必要なら)

# my_dat$Species <- relevel(my_dat$Species, ref = “virginica”)

# 多項ロジスティック回帰モデルの構築

# trace = FALSE は、最適化の過程を表示しないようにするためのものです

model_nominal <- multinom(Species ~ x1 + x2, data = my_dat, trace = FALSE)

# モデルの要約を表示

summary(model_nominal)

出力の解釈

summary(model_nominal)のCoefficientsセクションを見ると、x1とx2の係数がどのように表示されるかを確認できます。

  • x1について:
    x1Bのような係数は表示されず、x1A、x1C、x1Dのような係数が表示されます。これは、それぞれのレベル(A, C, D)が参照基準Bと比較してどうであるかを示します。
  • x2について:
    x2Zのような係数は表示されず、x2X、x2Yのような係数が表示されます。これは、それぞれのレベル(X, Y)が参照基準Zと比較してどうであるかを示します。

重要な注意点:

  • factor型であることの確認: 説明変数がfactor型であることを常に確認してください。文字列型のままではRは自動的にダミー変数化しません。
  • デフォルトの動作: relevel()を使用しない場合、Rはアルファベット順(または数値順)で最初のレベルを参照基準とします。
  • 他の参照基準設定方法: C()関数とcontr.treatments()を組み合わせて、モデルの式内で一時的に参照基準を設定することも可能ですが、relevel()でデータフレーム自体を変更する方が、コードが読みやすくなることが多いです。 例: multinom(Species ~ C(x1, contr.treatment(nlevels(x1), base=2)) + x2, data = my_dat) (この例ではx1の2番目のレベルを基準にする)

このように、説明変数に名義変数がある場合でも、relevel()関数を使用して参照基準を明示的に設定することができます。
—————

この解説で分かるように、説明変数が名義変数の場合は、参照基準はrelevelで設定できること、結果で得られる係数はそれぞれの名義変数の値に対する値であることが分かります。

さらに、名義変数の場合、Multi-dichotomous variableにあらかじめ手作業で変換する必要があるか聞いたところ、その必要はないという回答でした。

説明変数が名義変数の場合、multi-dichootmous variableにあらかじめ変換する必要はありますか?

いいえ、Rのmultinom関数(および多くの統計モデリング関数、例:lm, glm)を使用する場合、説明変数である名義変数(カテゴリカル変数)を事前に手動でmulti-dichotomous variable(多値二項変数、つまりダミー変数)に変換する必要はありません。

Rは、データフレーム内の変数がfactor型として定義されていれば、multinom関数に渡されたときに、内部的に自動でダミー変数に変換してくれます。これがRのモデリング関数の便利な点の1つです。

Rが自動的に行うこと:

  1. factor型変数の検出: モデル式(例: Species ~ x1 + x2)の中にfactor型の変数があると、Rはそれを自動的に認識します。
  2. ダミー変数の生成: 例えば、x1がA, B, C, Dの4つのレベルを持つfactor型の場合、Rは自動的に3つのダミー変数を生成します。
    • x1B (1 if x1 is B, 0 otherwise)
    • x1C (1 if x1 is C, 0 otherwise)
    • x1D (1 if x1 is D, 0 otherwise) (これはデフォルトの設定で、最初のレベルAが参照基準となり、そのダミー変数は生成されません。)
  3. モデルへの組み込み: これらの生成されたダミー変数が、回帰モデルの独立した予測変数として組み込まれます。

参照基準の設定の重要性:

Rは自動的にダミー変数を生成してくれますが、どのカテゴリを参照基準(ベースライン)とするかは、結果の解釈に影響します。デフォルトでは、factor型の最初のレベルが参照基準になります。

もし、特定のカテゴリを参照基準にしたい場合は、前回の回答で説明したようにrelevel()関数を使ってそのカテゴリを因子の最初のレベルに設定する必要があります。

例(再掲):

R

# データをシミュレート

my_dat <- data.frame(

  Species = as.factor(sample(c(“setosa”, “versicolor”, “virginica”), 100, replace = TRUE)),

  x1 = as.factor(sample(c(“A”, “B”, “C”, “D”), 100, replace = TRUE)),

  x2 = as.factor(sample(c(“X”, “Y”, “Z”), 100, replace = TRUE))

)

# x1の参照基準を ‘B’ に設定

my_dat$x1 <- relevel(my_dat$x1, ref = “B”)

# x2の参照基準を ‘Z’ に設定

my_dat$x2 <- relevel(my_dat$x2, ref = “Z”)

library(nnet)

model_nominal <- multinom(Species ~ x1 + x2, data = my_dat, trace = FALSE)

summary(model_nominal)

このコードでは、x1とx2がfactor型として定義されていれば、Rが自動的に内部で必要なダミー変数変換を行い、multinom関数はそれらを使ってモデルを構築します。あなたは手動でx1_A, x1_C, x1_Dなどの新しいカラムを作成する必要はありません。

結論:

名義変数をfactor型として適切に定義し、必要であればrelevel()で参照基準を設定するだけで、Rのmultinom関数は適切に処理してくれます。手動でのダミー変数への変換は不要です。
——————

さてこれで、nnetを使った多項ロジスティック回帰分析のやり方は、分かったと思いますがいかがでしたか。Geminiに分からないことを聞きながら、そのまま実行可能なスクリプトが提示されるので、素晴らしいと思います。

多項ロジスティック回帰分析 – 1 – 臨床医学研究における活用

今回もAIについての話題です。ブラウザのChromeからGoogleのGemini 2.5 Flashを開き、「臨床医学研究で多項ロジスティック回帰分析はどのように利用されていますか?」と聞いてみました。その回答をそのままGammaにテキストとして入力して、8枚のスライドを作成し、PDFファイルとしてダウンロードしました。GeminiとGamma、2つのAIであっという間にこのような資料が作成できます。PPTファイルも作成できます。

最初のスライドです:

多重ロジスティク回帰分析では従属変数が二値である事象が起きる/起きないですが、多項ロジスティック回帰分析 Multinomial logistic regression analysisは従属変数が3つ以上の値をとる名義変数で、説明変数は複数の連続変数、名義変数を設定でき、それらの説明変数の値により3つ以上の名義変数のそれぞれの起きる確率を計算できます。臨床医学ではさまざまな活用シーンが考えられます。

PDFファイルは、ここから開いてみることができますLink

多項ロジスティック回帰分析には、Rのパッケージnnetなどを使うことができます。

次の投稿では、スクリプトやデータ形式などについてGeminiに聞きながらその実用性を試そうと思います

CopilotでRスクリプトを作成する:時間イベント分析のサンプルサイズの計算

Copilotでブロンプトを書いてさまざまなプログラミング言語のコードを作成することができます。例えば、Rのスクリプトを作成できます。

一つの例として、RのTrialSizeというサンプルサイズを計算するためのパッケージを使って、Time-to-event (時間イベント分析)(生存分析)で2群のハザード率を比較するのに必要なサンプルサイズを計算するスクリプトの作成を試みてみました。

TrialSizeの関数の内、TwoSampleSurvival.Equalityが差があるかどうかを分析するために必要なサンプルサイズを計算する関数です。この関数は8つの引数を設定します。TrialSizeのマニュアルの該当箇所に以下の様に書かれています。

TwoSampleSurvival.Equality(alpha,beta,lam1,lam2,k,ttotal,taccrual,gamma)

この関数の演算結果を変数resに格納するというスクリプトは以下の様になります。ここまでは自分で考えて書きます。

res=TwoSampleSurvival.Equality(alpha,beta,lam1,lam2,k,ttotal,taccrual,gamma)

そこで、Copilotに次のように聞いてみました。

RのパッケージTrialSizeの関数res=TwoSampleSurvival.Equality(alpha,beta,lam1,lam2,k,ttotal,taccrual,gamma)について解説してください。lam2が対照群、lam1が介入群のハザード率とします。

その回答は以下の通りです:

TwoSampleSurvival.Equality は、Rの TrialSize パッケージに含まれる関数で、生存データの指数モデルにおける2群のハザード率の差を検定するために使用されます。

関数の概要

この関数は、介入群(lam1)と対照群(lam2)のハザード率が等しいかどうかを検定するために設計されています。帰無仮説(H0)と対立仮説(Ha)は以下のようになります:

  • H0(帰無仮説): 介入群と対照群のハザード率の差はゼロである(等しい)
  • Ha(対立仮説): 介入群と対照群のハザード率の差はゼロではない(異なる)

引数の説明

この関数には以下の引数があります:

  • alpha:有意水準(例:0.05)
  • beta:検出力(power = 1 – beta)
  • lam1:介入群のハザード率
  • lam2:対照群のハザード率
  • k:サンプルサイズ比(k = n1/n2)
  • ttotal:試験の総期間
  • taccrual:被験者登録期間
  • gamma:指数分布のパラメータ(gamma = 0 の場合は一様な患者登録を仮定)

使用例

以下のコードは、TwoSampleSurvival.Equality を使用した例です:

Example.7.2.4 <- TwoSampleSurvival.Equality(0.05, 0.2, 1, 2, 1, 3, 1, 0.00001)
print(Example.7.2.4)

このコードでは、有意水準 0.05、検出力 0.2、介入群のハザード率 1、対照群のハザード率 2 などのパラメータを設定し、検定を実行しています。

この関数を使うことで、介入群と対照群の生存率に統計的な有意差があるかどうかを評価できます。試験デザインの計画やサンプルサイズの決定に役立つでしょう。

試してみて、何か疑問があれば教えてください!📊###ここまでCopilotの回答。

さて、実際に動かせるスクリプト例が出力されているので、Rを起動して、ファイルメニューから新しいスクリプトを開いて、library(TrialSize)と書き込んで、それに続けて、スクリプトの部分をコピーして、ペーストします。そして、Rのエディタウインドウで全体を選択して、実行ボタンをクリックして実行します。

結果がコンソールに出力されますが、TwoSampleSurvial.Equality関数を実行した次の行に2つの数値が出力されていますが、まずこれが何かについてCopilotに聞いてみましょう。

実行すると2つの値がコンソールに出力されますが、これは何でしょうか?

Copilotの答えは、介入群(n1)のサンプルサイズと対照群(n2)のサンプルサイズですということでしたが、これは明らかに間違っています。そこで、TwoSampleSurvival.Equalityの関数のスクリプトを提示してもらい、関数の中身を確認しよう思います。

TwoSamplSurvival.Equality関数のスクリプトを見せてください。

得られた回答は、RDocumentationやQuantargoやrdrr.ioを参照しろというものでした。そこで、この関数のスクリプトをRで表示させる方法がないか聞いてみました。

TrialSizeにこの関数のスクリプトを提示するようにするRの関数はありますか?

次の回答が得られました:

Rには、関数のソースコードを表示するための関数 がいくつかあります。TrialSize パッケージの TwoSampleSurvival.Equality 関数のスクリプトを確認するには、以下の方法を試してみてください。

1. getAnywhere() を使用

getAnywhere() 関数を使うと、パッケージ内の関数のソースコードを表示できます:

getAnywhere(TwoSampleSurvival.Equality)

この方法は、関数がエクスポートされていない場合でもコードを確認できることがあります。

2. TrialSize パッケージをロードして print()

関数がオブジェクトとして格納されている場合、print() を使うことでコードの一部を確認できることがあります:

library(TrialSize)
print(TwoSampleSurvival.Equality)

ただし、関数がコンパイル済みである場合は、ソースコードが表示されないことがあります。

3. body() を使用

関数の本体部分を取得するには、body() を使います:

body(TwoSampleSurvival.Equality)

これにより、関数の処理内容を確認できます。

4. deparse() を使用

関数のコードを文字列として取得するには、deparse() を使います:

deparse(TwoSampleSurvival.Equality)

この方法では、関数のコードがリスト形式で出力されます。

関数のソースコードが非公開の場合、これらの方法では表示できないこともあります。その場合は、パッケージの公式ドキュメントGitHubリポジトリ を確認するのが良いでしょう。

試してみて、うまくいかなかったら教えてください!📊###ここまでCopilotの回答

Copilotの回答の中から、getAnywhere(TwoSampleSurvival.Equality)でこの関数の情報が得られそうだとわかったので、これをRで実行したところ、この関数の中身がコンソールに出力されました。

このスクリプトを見ると、print(variance1)とprint(variance2)というコードがあるので、上記の2つの値は、lam1すなわち、介入群のハザード率の分散とlam2すなわち対照群の分散の値だということが分かりました。(各分散の計算式は、TrialSizeの作者らの著書”Chow SC, Shao J, Wang H, Lokhnygina Y: Sample Size Calculations In Clinical Research. CRC Press, Taylor & Francis Group, 2018, New York, NY, USA.”の150ページに書かれているものと同じでした。TrialSizeの作者の著書なので。)

そして、この関数はn2を返す関数なので、結果には対照群のサンプルサイズが格納されていることになります。そして、上記の引数の解説からわかるように、介入群のサンプルサイズはその値にkを掛け算して得られるはずです。

ここで、スクリプトを、より一般的な目的に合わせて書き換えようと思います。引数の値をあらかじめ上記の例と同じ値に設定し、TwoSampleSurvival.Equality関数を実行します。結果は変数resに格納されます。以下の様にCopilotに指示しました。

Example.7.2.4 <- TwoSampleSurvival.Equality(0.05, 0.2, 1, 2, 1, 3, 1, 0.00001) print(Example.7.2.4) このスクリプト書き換えて、各引数を同じ名前の変数にこの例と同じ値を設定し、結果は変数resに格納するスクリプトを書いてください。最初にライブラリの読み込みのスクリプトも追加してください。結果は、対照群のサンプルサイズ、介入群のサンプルサイズ、総サンプルサイズを出力するようにしてください。なお、resには対照群のサンプルサイズが格納されます。

その回答は:

以下のRスクリプトでは、TrialSize パッケージを読み込み、各引数を同じ名前の変数に設定した上で、TwoSampleSurvival.Equality() を実行し、結果を res に格納します。
res には対照群のサンプルサイズが格納されるため、そこから介入群のサンプルサイズ総サンプルサイズを計算し、出力するようにしています。

# ライブラリの読み込み
library(TrialSize)

# 各引数の設定
alpha <- 0.05
beta <- 0.2
lam1 <- 1  # 介入群のハザード率
lam2 <- 2  # 対照群のハザード率
k <- 1     # サンプルサイズ比 (n1/n2)
ttotal <- 3
taccrual <- 1
gamma <- 0.00001

# サンプルサイズの計算 (対照群のサンプルサイズ)
res <- TwoSampleSurvival.Equality(alpha, beta, lam1, lam2, k, ttotal, taccrual, gamma)

# 介入群のサンプルサイズを計算
n1 <- k * res  # 介入群のサンプルサイズ
n_total <- n1 + res  # 総サンプルサイズ

# 結果の出力
cat("対照群のサンプルサイズ:", round(res), "\n")
cat("介入群のサンプルサイズ:", round(n1), "\n")
cat("総サンプルサイズ:", round(n_total), "\n")

このスクリプトを実行すると、res に対照群のサンプルサイズが格納され、そこから介入群と総サンプルサイズを計算して出力します。
round() を使って整数値に丸めていますが、必要に応じて調整してください! 📝✨###ここまでCopilotの回答。

見たところ、結果の出力のスクリプトの部分は少し問題がありそうですが、まずそのままスクリプトをコピーしてRで実行させてみます。エラーが起きることなく、サンプルサイズのデータが出力されました。

なお、”\n”は改行のコードですが、以下の様にpaste()関数で文字列を結合していないため、そのまま書き出されています。この場合は、”\n”は不要です。

もし、cat(paste(“総サンプルサイズ:”, round(n_total), “\n”,”介入群のサンプルサイズ:”, round(n1), “\n”,”総サンプルサイズ:”, round(n_total),”\n”))と言うスクリプトであれば、下に示すように改行が入って出力されます。paste()関数はRの関数で文字列を結合します。sep=””と設定しないとスペース区切りになります。

それでは、今度は、lam1, lam2のハザード率の値を時間tの生存率から計算する方法をCopilotに聞いてみましょう。

lam1を介入群、lam2を対照群のハザード率とします。lam1, lam2のハザード率の値を時間tの生存率p1, p2から計算するスクリプトは?

その回答は:

以下のRスクリプトでは、介入群のハザード率を lam1、対照群のハザード率を lam2 とし、それぞれ時間 t における生存率 p1, p2 から計算します。

計算式

指数分布の性質を利用して、ハザード率は以下の式で求めます:

[ \lambda = -\frac{\ln(p)}{t} ]

ここで:

  • p1介入群の生存率
  • p2対照群の生存率
  • t試験期間

Rスクリプト

# パラメータの設定
t <- 5    # 時間
p1 <- 0.8 # 介入群の生存率
p2 <- 0.6 # 対照群の生存率

# ハザード率の計算
lam1 <- -log(p1) / t  # 介入群のハザード率
lam2 <- -log(p2) / t  # 対照群のハザード率

# 結果の出力
cat("介入群のハザード率 (lam1):", lam1, "\n")
cat("対照群のハザード率 (lam2):", lam2, "\n")

ポイント

  • 生存率 p が高いほど、ハザード率 λ は小さくなります。
  • 時間 t が長いほど、イベント発生の確率が低いため、ハザード率は小さくなります
  • p1p2 の値は 0~1 の範囲で指定する必要があります。

このスクリプトを使えば、指定した 生存率 から ハザード率 を簡単に計算できます。
試してみて、期待どおりの結果が出るかチェックしてみてください!
もしカスタマイズしたい点があれば、気軽に教えてくださいね。###ここまでCopilotの回答

確かにその通りでした。さらに、今度はハザード比を使う場合、すなわち、対照群の時間tの生存率pcで、ハザード比がhrの場合に、lam1, lam2を計算するスクリプトを聞いてみましょう。

対照群の時間tの生存率pcで、ハザード比がhrの場合に、lam1, lam2を計算するスクリプトは?

その回答は:

以下のRスクリプトでは、対照群の生存率 (pc) を基に、ハザード比 (hr) を考慮して、対照群 (lam2) と介入群 (lam1) のハザード率 を計算します。

計算式

指数分布の性質を利用して、ハザード率は以下の式で求めます:

[ \lambda_2 = -\frac{\ln(pc)}{t} ]

[ \lambda_1 = \lambda_2 \times hr ]

ここで:

  • pc対照群の生存率
  • hrハザード比
  • t試験期間
  • lam2対照群のハザード率
  • lam1介入群のハザード率 (lam2 × hr)

Rスクリプト

# パラメータの設定
t <- 5    # 時間
pc <- 0.6 # 対照群の時間tの生存率
hr <- 0.75 # ハザード比 (介入群のリスクが対照群の75%)

# ハザード率の計算
lam2 <- -log(pc) / t  # 対照群のハザード率
lam1 <- lam2 * hr     # 介入群のハザード率 (ハザード比を適用)

# 結果の出力
cat("対照群のハザード率 (lam2):", lam2, "\n")
cat("介入群のハザード率 (lam1):", lam1, "\n")

ポイント

  • hr < 1 の場合、介入群のハザード率 lam1対照群より低く なり、リスクが低減する。
  • hr > 1 の場合、介入群のハザード率 lam1対照群より高く なり、リスクが増加する。
  • 時間 t を変更すると、ハザード率のスケールが変わる。

このスクリプトで、生存率 (pc) とハザード比 (hr) から介入群・対照群のハザード率を求める ことができます。
試してみて、適切な結果が得られるか確認してみてください!
追加のカスタマイズが必要なら、気軽に教えてくださいね。###ここまでCopilotの回答

これは正しそうです。ここでRのlogは自然対数を計算します。Excelではlnです。つまり、時間tの生存率(イベント率ではありません)からハザード率を計算する式は-ln(生存率)/tです。

このサンプルサイズの計算の前提条件についてもCopilotに聞いてみましょう。

TrialSizeのTwoSampleSurvival.Equality関数によるサンプルサイズの計算の前提条件を教えてください。

TrialSize パッケージの TwoSampleSurvival.Equality 関数を用いたサンプルサイズの計算には、いくつかの前提条件があります。以下のポイントが重要です:

1. ハザード率の仮定

  • 介入群(lam1)と対照群(lam2)のハザード率が指数分布に従うことが前提です。
  • 比例ハザードの仮定(時間経過によってハザード比が変化しない)を満たす必要があります。

2. 有意水準(α)と検出力(1 – β)

  • α(有意水準):通常 0.050.01 が使用されます。
  • β(第2種過誤):一般的に 0.2(検出力80%)0.1(検出力90%) が選ばれます。

3. サンプルサイズ比(k)

  • 介入群と対照群のサンプルサイズ比(k = n1/n2) を設定する必要があります。
  • 通常は 1:1 の比率が推奨されますが、異なる比率も可能です。

4. 試験期間(ttotal)と登録期間(taccrual)

  • 試験の総期間(ttotal)被験者登録期間(taccrual) を考慮する必要があります。
  • 追跡期間が短すぎると、十分なイベント数が得られない可能性があります。

5. 患者登録の分布(gamma)

  • gamma = 0 の場合、患者登録が一様分布であると仮定されます。
  • gamma の値を変更することで、異なる登録パターンを考慮できます。

6. 打ち切りデータの考慮

  • 観察期間内にイベントが発生しなかったデータ(打ち切りデータ) を適切に処理する必要があります。
  • Coxモデルでは、打ち切りデータを考慮した解析が可能です。

これらの前提条件を満たすことで、適切なサンプルサイズを計算し、試験の統計的検出力を確保できます。さらに詳しく知りたい場合は、こちらの情報も参考になります!📊###ここまでCopilotの回答。

確かにその通りです。ハザード率が指数分布に従うというのは、例えば、1年後の生存率が0.9であれば、2年後は0.9×0.9、3年後は0.9×0.9×0.9と言う様に累乗になっていくということです。生存分析の場合、イベントは死亡です。この例では、1年後の累積イベント率(死亡率)は1 – 0.9 = 0.1で、2年後の累積イベント率は1 – 0.9×0.9 = 0.19となります。時間tにおける、死亡率がpcとすると、ハザード率 = -ln(1 – pc)/tで計算されます。1 – pcは生存率なので、生存率の自然対数に-1を掛算して、それを測定された時間で割り算するとハザード率が得られるということです。pcが対照群の時間tにおけるイベント率だとすると、このハザード率にハザード比を掛け算した値が介入群のハザード率になります。-ln(0.5)/ハザード率が生存期間中央値Median Survival Time (MST)になります。時間tをどこに設定するかは生存曲線をみて、指数関数による生存曲線ができるだけフィットしそうなところを選ぶのがひとつの方法です。

指数関数を用いる生存分析でサンプルサイズを計算するには、各群のハザード率、登録期間(Accrual time)と全試験期間(Total trial time)、α水準、βまたはPower(検出力)、そして、エントリーのパターンを指定するGammaの値が必要なことが分かります。Gammaは一定のスピードでエントリーがある場合は0ですが、引数を0にすると、分散の計算で0での割り算が生じるので、0.00001のような値を設定します。正負によって、パターンが上に凸か凹が決まります(Chow SCらの書籍を参照してください)。また、ハザード率の分散は登録期間、全試験期間とGammaによって決まります。

さて、Copilotはプログラミングに関して、かなり優れていて、有用なコードあるいはスクリプトを教えてくれます。しかし、やはり間違いが混ざることがあります。プログラムのコードの場合は、実行した際にエラーが起きる、結果が正しくないということで、間違いだということが分かるので、大きな問題は起きにくいと思われます。また、良い点としては、自分が知らない、あるいは今まで使ったことのないコードを教えてもらえるということがあります。

今後、データの変数名の設定と分析法をCopilotに伝えて、Rのスクリプトを作成させるということをいろいろ試してみたら面白いのではないかと思います。スクリプトを自分でキーボードから入力しないで済むので、それだけでも効率化が図れます。

自分があまりよく知らないことについて、Copilot、Gemini、ChatGPTに尋ねる場合は、回答をうのみにすることは避けるべきです。自分でそれが正しいかどうか判断できるものについては、効率化が図れることは間違いありません。また、自分でもあやふやな場合、その回答が正しいか何らかの方法で確かめることが必要になるでしょう。

補足:

Copilotに2群の生存率を比較する際のサンプルサイズを計算する関数はありますか?」と聞いてみたところ、Cox.Equalityなどがあるという回答で、いろいろ聞き方をかえてもTwoSampleSurvival.Equalityはなかなか出てきませんでした。「RパッケージTrialSizeには、2つの独立した群の生存率を比較する際のサンプルサイズを計算する関数がありますか?」と聞くと、以下の様な回答で、同関数があることがやって出てきました。

Copilotの回答です:

はい、あります!TrialSizeパッケージには TwoSampleSurvival.Equality という関数があり、2つの独立した群の生存率を比較する際のサンプルサイズを計算できます。この関数は、ログランク検定を用いた生存分析に基づいて、必要なサンプルサイズを求めるのに適しています。

例えば、以下のように使用できます:

library(TrialSize)

TwoSampleSurvival.Equality(alpha = 0.05, power = 0.8, lambda1 = 0.03, lambda2 = 0.01, t = 2, sided = 2)
  • lambda1, lambda2 は各群のイベント発生率
  • t は観察時間
  • alpha は有意水準
  • power は検出力
  • sided は片側/両側検定の指定

この関数を使うことで、研究の目的に応じた適切なサンプルサイズを計算できます。もしパラメータの選び方について相談があれば、お気軽にどうぞ!###Copilotの回答ここまで。

このスクリプトにはいくつか間違いがあり、このままではエラーが起きてしまいます。この関数の引数に間違いがあり、powerではなくbetaを設定する必要があり、lambda1, lambda2はそれぞれlam1, lam2です。さらに、sidedという引数はもともとありません。上記の関数のスクリプトでは、qnorm(1 – alpha/2)という計算が行われており、alphaの値を半分にしているので、Two-sidedの設定になっていることが分かります。(もしOne-sidedにしたければ2倍の値をalphaに設定する。)これはハルシネーションですね。

RパッケージTrialSizeには、2つの独立した群のハザード率を比較する際のサンプルサイズを計算する関数がありますか?」に対しては、TwoSampleSurvival.HazardRatio関数がありますという回答でしたが、実際にはこのような関数はありません。これも、ハルシネーションですね。

また、AIは同じ質問でも、時間を変えると、違う回答のこともあります。やはり、AIの回答をそのまま100%信じるのは危険ですね。