2016-04-27 17 views
1

forループ内でnlmeパッケージのlme関数を使用しようとしています。私は(ほとんど)すべてのことを試しましたが、運が全くありません。ループがなければ、私のlme関数は正常に動作しています。私は分析するために681種類の脂質があるので、私はループが必要です。lme()のループをrで作成する

ボーナス情報:

  • 私はSTR()を使用していると、ループ

私のデータの簡易版は、次のようになり前に、私のデータは、同じ長さを持っています

>dput(head("ex.lme(loop)")) structure(list(Lacal.Patient.ID = c(12L, 12L, 12L, 13L, 13L, 13L), Time = c(0L, 1L, 3L, 0L, 1L, 3L), Remission = c(0L, 0L, 1L, 0L, 0L, 1L), Age = c(46L, 43L, 36L, 47L, 34L, 45L), SEX = structure(c(1L, 1L, 1L, 2L, 2L, 2L), .Label = c("f", "m"), class = "factor"), BMI = c(25L, 26L, 23L, 27L, 26L, 27L), Sph = c(0.412, 1.713, 1.48, 0.735, 1.025, 1.275), S1P = c(2.412, 3.713, 3.48, 2.735, 3.025, 3.275), Cer..C16. = c(1.4472, 2.2278, 2.088, 1.641, 1.815, 1.965)), .Names = c("Lacal.Patient.ID", "Time", "Remission", "Age", "SEX", "BMI", "Sph", "S1P", "Cer..C16."), row.names = c(NA, 6L ), class = "data.frame")

ここで私は何ですか?R:

lipid <-as.matrix(cer_data[,c(7:9)]) # my lipids a at row 7-9in my data 
beg <- 1 
end <- nrow(lipid) 
dim(lipid) 
for (i in beg:end) { 
    print(paste("Running entity: ", colnames(lipid)[i], " which is ",i, " out of", end)) 
    variable <- as.numeric(lipid[i]) 
    lme_cer <- lme(variable ~ Remission + Time + Age + BMI + SEX, random = ~1|Lacal.Patient.ID, method = "REML", data = cer_data) 
} 

エラー:model.frame.defaultでエラーが発生しました(式=〜変数+寛解+時間+:変数の長さは、(異なる見つかり、私はループがどのように見えるべきだと思いますどのように

library(nlme) attach(cer_data) Remission <- factor(Remission) Time <- factor(Time) SEX <- factor(SEX)

ループなしの '寛解')

私の分析正常に動作している(脂質は、(x))をひとつの脂質である:

lme_cer <- lme(lipid(x) ~ Remission + Time + Age + BMI + SEX , random = ~1 | Lacal.Patient.ID, method = "REML", data = cer_data) 
summary(lme_cer) 

誰も私のループで問題を見ることができますか?私はプログラミングやRの使用に慣れていないので、おそらくいくつかの愚かな間違いがあります。あなたのデータを知らず

+0

今度は、各行に対してlmeを実行しますが、間違っています。 'end < - nrow(脂質)'を見てください。ユニークな脂質を選択し、それらのためのループを行う必要があります。 – Mateusz1981

+0

と質問を再現可能にするために使用するデータを 'dput'してください – Mateusz1981

+0

データセットの行と列の内容を再評価する必要があります。 4つの観察:まず、脂質データを作成するときに、完全なデータセットからいくつかのカラムを選択します。次に、何らかの理由で「私の脂質は1-881行にあります」と書いていますが、これは間違いなく正しいものです。第3に、変数が列にあり(行ではなくても)、 '1'から' nrow(lipids) 'にループ・ランニンを作成します。最後に、ループ内で、行と列のどちらも選択せず、その行列の要素を1つだけ選択する 'lipid [i]'を選択します。 – SimonG

答えて

1

ブラインドの答えのようにかなっでなければなりません。

私のアプローチとあなたのアプローチの主な違いは、データセット内の脂質の位置ではなく、脂質の名前をループすることです。これにより、私は(a)エラーの起こりにくい方法で一時的なデータセットを構築し、(b)モデルの固定効果部分の一時式を構築することができます。

lme関数は、一時式を使用した一時データセットに適用され、結果はリストに保存され、簡単にアクセスできます。

# names of lipids 
lipid.names <- colnames(cer_data)[1:881] 
no.lipids <- length(lipid.names) 

# create a named list to hold the fitted models 
fitlist <- as.list(1:no.lipids) 
names(fitlist) <- lipid.names 

# loop over lipid names 
for(i in lipid.names){ 

    # print status 
    print(paste("Running entity:", i, "which is", which(lipid.names==i), "out of", no.lipids)) 

    # create temporary data matrix and model formula 
    tmp <- cer_data[, c(i,"Remission","Time","Age","BMI","SEX","Local.Patient.ID")] 
    fml <- as.formula(paste(i, "~", paste(c("Remission","Time","Age","BMI","SEX"), collapse="+"))) 

    # assign fit to list by name 
    fitlist[[i]] <- lme(fml, random=~1|Lacal.Patient.ID, method="REML", data=tmp) 

} 

私の意見では、ループの繰り返しで必要なものを正確に含む一時的なオブジェクトを扱うのが最も簡単です。

再現可能な例を提供していないため、このソリューションではエラーを確認できません。Here's how

0

は、概念的には、(私は彼らがいると思うと)あなたの従属変数は、行の列に整理していないされていると仮定し、その

df <- data.frame(lipid = rep(c(LETTERS[1:4]), each = 4), x1 = c(rnorm(16, 10, 1)), x2 = c(rnorm(16, 20, 5))) 
    df 

for (i in levels(df$lipid)){ 
    print(paste("MODEL", i, sep = "")) 
    df1 = subset(df, lipid == i) 
    model <- lm(x1~x2, data = df1) 
    print(summary(model)$coef) 
} 
1

ソリューション:私のループは、この単純なコードで、今取り組んでいる:

lipid <-as.data.frame(cer_data[,c(7:9)]) dim(lipid) for (i in 1:length(lipid)) { variable <- lipid[,i] lme_cer <- lme(variable ~ factor(Remission) + Time + Age + BMI + SEX, random = ~1 | Lacal.Patient.ID, method = "REML", data = cer_data) print(summary(lme_cer)$tTable) }

は素晴らしい助けありがとうございました!

関連する問題