No.07023 スカラー型数値入力とベクトル型(配列型)数値入植  【R初心者】 2008/07/15(Tue) 14:51

以下,エクセルの表から,回帰係数等を算出したいと思っています。

for (i in 1:(ln-1)) {
x <- a[i]                  # x変数値入力
for (j in (i+1):ln) {
y <-a [j];                 # y変数値入力
xx <- var(x)*(nr-1)/nr; #計算
yy <- var(y)*(nr-1)/nr;
xy <- var(x, y)*(nr-1)/nr;
r <- ??(r,xy/sqrt(xx*yy));         #r[1],r[2]とrの中に入力したい。
k <- ??(k,xy/xx);
b <- ??(b,mean(y)-k*mean(x));
t <- ??(t,sqrt(r^2*(nr-2)/(1-r^2)));
}
}

No.07025 Re: スカラー型数値入力とベクトル型(配列型)数値入植  【R初心者】 2008/07/15(Tue) 15:40

大変,おみぐるしい質問ですみません。
解決しました。
ベクトル型(配列型)数値入力の方法は,わからなかったのですが,
以下,
kaiki_loop<-function(a)
{
nr <- nrow(a);
ln <- length(a);
out<-NULL;
for (i in 1:(ln-1))
{
x<-a[i]
for (j in (i+1):ln)
{
y<-a[j];
xx<-var(x)*(nr-1)/nr;
yy<-var(y)*(nr-1)/nr;
xy<-var(x, y)*(nr-1)/nr;
r<-xy/sqrt(xx*yy);
k<-xy/xx;
b<-(mean(y)-k*mean(x));
t<-sqrt(r^2*(nr-2)/(1-r^2));
out<-cbind(out,c(i));
out<-cbind(out,",");
out<-cbind(out,c(j));
out<-cbind(out,",");
out<-cbind(out,c(r));
out<-cbind(out,",");
out<-cbind(out,c(k));
out<-cbind(out,",");
out<-cbind(out,c(b));
out<-cbind(out,",");
out<-cbind(out,c(t));
}
}
write(out,file="c:/usr/data1.txt",ncolumns=11);
};
で,配列型に,データ出力しました。
すみませんでした。
ありがとうございました。

No.07029 Re: スカラー型数値入力とベクトル型(配列型)数値入植  【青木繁伸】 2008/07/15(Tue) 17:19

ファイルに書き出したものは,貴方の望んでいたものですか?確認しましたか?

a というのは,二次元配列ですか?
だとすると,length(a) は,配列の全要素数(n行m列の行列なら,n*m)になりますよ。
for (i in 1:(ln-1))
{
x<-a[i]
for (j in (i+1):ln)
{
y<-a[j];
で,x, y には,何を入れたいのでしょうか?a[i] は行列をベクトルにしたときのi番目ただ一つの数値が入りますよ。後ろの方をみると,i列目を入れたいのではないかと思いますが,そのようなときには a[,i] とします。
Rとは無関係ですが,相関係数を求めるときには*(nr-1)/nr修正項は不要です。
out<-cbind(out,c(i));以降の cbind は何をやりたいのでしょうか。cbind は列ベクトルを束ねるものですから用途が違うと思いますよ。また,1つの数値を表すときに c(i) のようにする必要はないです。単に i で良いです。c は,複数のものをベクトルにするときに使います c(1, 3, 6,x, 9) のように。
なお,R では行末に ; はいりません。(; は一行に複数の文を書くときに,文を区切るものです。その場合も,最後の文の後の ; は不要です。a <- 1; b <- 3; x <- 3.3 のように。

なお,R には,直線回帰(重回帰)を行う関数が用意されています。lm という関数をオンラインヘルプ(あるいは,貴方が持っている本)で調べてみてください。x, y に数値ベクトルデータが入っているとき,ans <- lm(y~x) とすると,coefficients(ans)で係数ベクトルが得られます(そのほかの情報も)。相関係数は単にr <- cor(x, y)で求まります。

No.07033 Re: スカラー型数値入力とベクトル型(配列型)数値入植  【青木繁伸】 2008/07/15(Tue) 17:54

nr行nc列の行列があって,i, j の二列(ただし i < j)について相関係数と,無相関検定のt値と,直線回帰式の切片と傾きをファイルに書き出したいということなら,以下のようなプログラムになるでしょう。
func <- function(a)
{
nr <- nrow(a)
nc <- ncol(a)
for (i in 1:(nc-1)) {
x <- a[,i]
for (j in (i+1):nc) {
y <- a[,j]
r <- cor(x, y)
coef <- coefficients(lm(y~x))
k <- coef[2]
b <- coef[1]
t <- r*sqrt((nr-2)/(1-r^2))
cat(i, j, r, k, b, t, sep=",", fill=TRUE)
}
}
}
行列 x を定義してから,func(x)とすれば,画面に結果が表示され,
sink("c:/usr/data1.txt")
func(x)
sink()
とすれば,ファイルに書き出されるでしょう。

No.07039 Re: スカラー型数値入力とベクトル型(配列型)数値入植  【R初心者】 2008/07/16(Wed) 09:45

>x, y には,何を入れたいのでしょうか?a[i] は行列をベクトルにしたときのi番目ただ一つの数値が入りますよ。後ろの方をみると,i列目を入れたいのではないかと思いますが,そのようなときには a[,i] とします。
これは,エクセルのデータ形式が以下のようです。
age gpt r-gtp tcho hdlc tg crn
63.75999832 19 15 220 61 73 0.600000024
59.38999939 81 258 222 61 178 0.600000024
60.00999832 28 20 161 42 120 0.600000024
66.16000366 17 26 176 58 114 0.800000012
・・・・・・・

で,互いの単相関を調べたいと思ったわけです。数値は,検診データです。
そして,
>mean(a[1])
age
62.84415
>mean(a[,1])
[1] 62.84415
ですので,
x<-a[1]
で,ageが,xの中に入力され
>mean(x)で,mean(a[1])と同様になります。

No.07040 Re: スカラー型数値入力とベクトル型(配列型)数値入植  【青木繁伸】 2008/07/16(Wed) 10:07

> >mean(x)で,mean(a[1])と同様になります

二次元配列ではなく,ちゃんとデータフレームに入れていたというわけですね。

No.07041 Re: スカラー型数値入力とベクトル型(配列型)数値入植  【R初心者】 2008/07/16(Wed) 10:13

エクセルで,選択し,
>a<-read.delim("clipboard")
で,aにデータを入力していました。

No.07042 Re: スカラー型数値入力とベクトル型(配列型)数値入植  【R初心者】 2008/07/16(Wed) 11:12

kaiki_loop<- function(a)
{
nr <- nrow(a);
ln <- length(a);
for (i in 1:(ln-1))
{
x <- a[,i]
for (j in (i+1):ln)
{
y <- a[,j]
r <- cor(x, y)
coef <- coefficients(lm(y~x))
k <- coef[2]
b <- coef[1]
t <- r*sqrt((nr-2)/(1-r^2))
# cat(i,j, r, k, b, t, sep=",", fill=TRUE)
cat(paste(colnames(a[i])), paste(colnames(a[j])), r, k, b, t, sep=",", fill=TRUE)
}
}
}
で,求めるものが得られました。lm(y~x)では,x<-a[,i]という入力になり,列の名前は,colnames(a[i])となりました。

● 「統計学関連なんでもあり」の過去ログ--- 041 の目次へジャンプ
● 「統計学関連なんでもあり」の目次へジャンプ
● 直前のページへ戻る